更新Redis缓存,再更新数据库;还是更新数据库再更新Redis
在大型系统中,为了抗住高并发,减少数据库压力。都会引入缓存机制,一旦加多了一层缓存。就必须要处理缓存数据与数据库不一致的问题。
更新缓存和数据的机制处理策略如下:
- Cache aside 旁路缓存
- Read/Write through 抽象缓存层
- Write behind 延迟写入
常见普通读/写请求流程
情况一:先更新数据库,再更新缓存
如果同时有两个写请求更新同一数据,每个写请求都是先更新数据库再更新缓存,在并发场景下可能会出现数据不一致
写请求1
更新数据库,将库存从100减一,写入数据库99写请求2
更新数据库,将库存从99减一,写入数据库98写请求2
更新缓存,set 98写请求1
更新缓存,set 99
情况二:先删除缓存,再更新数据库
如果同时有一个读请求和一个写请求并发场景下,写请求是先删除缓存再更新数据库,可能造成数据不一致
写请求
清除缓存读请求
查询缓存为空,查询数据库;返回库存100,再Set缓存100写请求
更新数据库为99
情况三:先更新数据库,在删除缓存
如果同时有一个读请求和一个写请求并发场景下,写请求是更新数据库再删除缓存,可能造成数据不一致
读请求
先查询缓存,再查询数据库 得到库存100写请求
更新数据库,库存为99,删除缓存读请求
将数据库值设置缓存 缓存100
综上
缓存通常会先更新数据库,然后再删除缓存,为了保障数据一致,还需要设置合理的缓存时间。
抽象缓存层
应用程序无需管理缓存和数据库,只需要将数据库的同步委托给缓存提供程序 Cache Provider 即可。所有数据交互都是通过抽象缓存层完成的。
Read/Write through 一般是由一个 Cache Provider 对外提供读写操作,应用程序不用感知操作的是缓存还是数据库。
缓存延迟写入
Write behind简单理解就是延迟写入,Cache Provider 每隔一段时间会批量输入数据库,优点是应用程序写入速度非常快。