1. 缓存更新策略
缓存中的数据一致性问题(数据库更新数据,而Redis存的是旧数据)
内存淘汰策略:当内存很充足时,很长时间无法淘汰数据,所以很难控制淘汰,一致性差;
超时剔除:取决于TTL大小,可以达到控制目的,但是在TTL时间内也可能存在数据库更新从而Redis中变成旧数据;
主动更新:也就是同时修改Redis和数据库的数据;
2. 主动更新策略
第二种:维护复杂,开发成本大;
第三种:维护异步任务难度大,要实时监控缓存中的变化;其次是一致性难以保证,如果缓存中已经存储了很多数据,但是还没有触发异步更新,这段时间内的缓存和数据库是不一致,当缓存宕机时,此时数据就会彻底丢失;
这里分析一下先操作缓存还是先操作数据库
- 先删除缓存,再操作数据库
正常情况:
异常情况(未加锁):这种情况出现的频率高
- 先操作数据库,再删除缓存
正常情况:
异常情况:这种情况出现的频率低,两个线程并行执行,且线程1查询缓存时恰好失效,同时查完数据库去写缓存,这里读写缓存的操作非常快。这时出现另一个线程2更新数据库,而数据库的读写操作较Redis缓存读写慢很多,所以数据库更新完毕之后再写缓存的概率极其低;
所以在概率的角度来选择也是先操作数据库,再删除缓存,并且可以再加一个超时剔除策略;