一般在系统中为了用户的体验,需要加上缓存来提升用户的体验。一般对实时性比较高的数据,可以不添加缓存;对于读多写少的数据,或者比较耗时的需要加缓存,并且要设置过期时间,或者更新数据的时候失效;另外一种基本不变的字典数据,则可以把过期时间设置长一点,或者直接使用jvm缓存,map等去存储。
那么,不可避免的问题是,你更新了数据库,缓存怎么去更新呢,才能保证与数据库中数据的一致性。一般大致有四种方法(一般缓存的数据都是经过接口调用后组合的数据,更新缓存的代价太大,因此不需要更新缓存,直接删除即可):

  1. 先更新数据库,后更新缓存
  2. 先更新数据库,后删除缓存
  3. 先更新缓存,后更新数据库
  4. 先删除缓存,后更新数据库

先删除缓存,再更新数据库

** 采用延时的策略,确保更新数据的事务已经提交之后,再删除redis缓存**

这种方法一般是针对单机数据库有用,如果采用主从架构的数据库,会有一定的延迟,查询查的是从库,数据还没同步过来呢,容易查出旧的数据。

主从结构的话可以通过:
如果是redis缓存中没有数据,需要查询数据库的时候,强制查询主数据库,填充redis缓存
这样就没问题了。

先更新数据库,再删除缓存

更新完数据库之后,删除缓存,听起来没什么问题,但遇到极端情况,缓存没有删除成功,怎么办。
这是需要将删除失败的redis的key,保存到队列中,然后再次去删除。