当前位置: 首页 > 面试题库 >

怎么保证缓存和数据库数据的一致性?

能旭
2023-04-24

1、淘汰缓存

数据如果为较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,因此一般推荐选择淘汰缓存,而不是更新缓存。

2、选择先淘汰缓存,再更新数据库

假如先更新数据库,再淘汰缓存,如果淘汰缓存失败,那么后面的请求都会得到脏数据,直至缓存过期。

假如先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。

3、延时双删策略

如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。

  1. 请求A进行写操作,删除缓存
  2. 请求B查询发现缓存不存在
  3. 请求B去数据库查询得到旧值
  4. 请求B将旧值写入缓存
  5. 请求A将新值写入数据库

次数便出现了数据不一致问题。采用延时双删策略得以解决。

public void write(String key,Object data){
    redisUtils.del(key);
    db.update(data);
    Thread.Sleep(100);
    redisUtils.del(key);
}

这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。

4、数据库读写分离的场景

两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。

  1. 请求A进行写操作,删除缓存
  2. 请求A将数据写入数据库了,
  3. 请求B查询缓存发现,缓存没有值
  4. 请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值
  5. 请求B将旧值写入缓存
  6. 数据库完成主从同步,从库变为新值

依旧采用延时双删策略解决此问题。

 类似资料:
  • 本文向大家介绍如何保证缓存与数据库双写时的数据一致性?相关面试题,主要包含被问及如何保证缓存与数据库双写时的数据一致性?时的应答技巧和注意事项,需要的朋友参考一下 合理设置缓存的过期时间。 新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

  • 面试题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。 串行

  • 数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。 重要 当缓存启用时,本类会被数据库驱动自动加载,切勿手动加载。 重要 并非所有查询结果都能被缓存,请仔细阅读本页内容。 启用缓存 启用缓存需要三步: 在服务器上创建一个可写的目录以便保存缓存文件; 通过文件 application/config/database.php 中的 cachedir 参数设置其目录路径; 通过将文件

  • SqliteOpenHelper只是一个工具,是SQL世界和OOP之间的一个通道。我们要新建几个类来请求已经保存在数据库中的数据,和保存新的数据。被定义的类会使用ForecastDbHelper和DataMapper来转换数据库中的数据到domain models。我仍旧使用默认值的方式来实现简单的依赖注入: class ForecastDb( val forecastDbHelper:

  • 数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。 它也是更高级缓存特性的基础,例如查询缓存 和内容缓存。 如下代码是一个典型的数据缓存使用模式。 其中 $cache 指向缓存组件: // 尝试从缓存中取回 $data $data = $cache->get($key); if ($data === false) { // $data 在缓存中没有找到,则重新计算它

  • setStorageSync 基础库1.3.9开始支持,iOS版本2.1.23,Android版本2.1.38 setStorageSync(string key, any data) ft.setStorage 的同步版本 参数 string key 本地缓存中指定的 key any data 需要存储的内容。只支持原生类型、Date、及能够通过JSON.stringify序列化的对象。 示例代