缓存是减轻数据库压力的一种解决办法,不过要做到缓存和数据库数据一致性。
给缓存设置过期时间,是保证数据最终一致性的办法,我们也要尽量保证使用时候的一致性。
一般不使用先更新缓存再更新数据库的方式,如果缓存更新成功而数据库更新失败,那肯定不行
那基本就还剩如下三种
1)先更新数据库,再更新缓存
2)先删除缓存,再更新数据库
3)先更新数据库,再删除缓存
依次分析
方法一:先更新数据库,再更新缓存
这种方法其实还有很多项目在这么用,不过是最糟糕的选项。
1、A更新数据库数据为a
2、B更新数据库数据为b
3、B更新缓存数据为b
4、A更新缓存数据为a
最终,数据库数据为b,而缓存数据为a
方法二:先删除缓存,再更新数据库
更新数据库之前先把缓存删除,由第一次的查询操作来添加缓存,不过也会导致不一致性
1、A删除缓存
2、B查询缓存未查到
3、B查询数据库为b,并更新缓存
4、A修改数据库为a
最终,数据库数据为a,而缓存数据为b
有个延时策略可以解决这个方法,就是在更新数据库之后,定时任务(例如1s后)执行删除缓存,把这期间保存的缓存数据删除掉
方法三:先更新数据库,再删除缓存
其实方法二的延时策略就有这个影子,不过也不是一定没问题,在缓存恰好失效时候有风险
1、缓存失效
2、A未查询到缓存,查询数据库
3、B更新数据库
4、B删除缓存
5、A更新缓存
不过这种情况发生的概率极低,因为更新数据库的时间大多比查询数据库的时间长,所以基本上的执行顺序都是2-5-3-4或者2-3-5-4
实在放心不下,继续使用延时策略
如果删除缓存出现异常呢,这个时候可以把删除缓存的工作放到消息队列里