如何保持数据库和缓存的一致性

更新缓存策略
失效:应用程序从cache取数据,没有得到,则从数据库取数据,然后将数据放入cache 
命中:应用从cache取数据,若取到则返回 
更新:把数据更新到数据库,然后使cache失效 
借用网上两张图 
如何保持数据库和缓存的一致性_第1张图片

如何保持数据库和缓存的一致性_第2张图片
有没有其他策略?
读操作容易理解,现在讨论一下写的操作

如果先使cache失效,后更新数据库,是否可行
这么做引发的问题是,如果A,B两个线程同时要更新数据,并且A,B已经都做完了删除缓存这一步,接下来,A先更新了数据库,C线程读取数据,由于缓存没有,则查数据库,并把A更新的数据,写入了缓存,最后B更新数据库。那么缓存和数据库的值就不一致了。

如果先把数据库更新,然后把cache更新(不是失效),是否可行
这么做引发的问题是,如果A,B两个线程同时做数据更新,A先更新了数据库,B后更新数据库,则此时数据库里存的是B的数据。而更新缓存的时候,是B先更新了缓存,而A后更新了缓存,则缓存里是A的数据。这样缓存和数据库的数据也不一致。

如果更新数据时,更新数据库成功,而失效cache时失败怎么解决?
1、对删除缓存进行重试,数据的一致性要求越高,我越是重试得快。 
2、定期全量更新,简单地说,就是我定期把缓存全部清掉,然后再全量加载。 
3、给所有的缓存一个失效期。(绝招,任何不一致,都可以靠失效期解决,失效期越短,数据一致性越高。但是失效期越短,查数据库就会越频繁。因此失效期应该根据业务来定)

不要缓存那些对数据一致性要求很高的数据
--------------------- 

原文:https://blog.csdn.net/sinat_16712671/article/details/76130829 
 

你可能感兴趣的:(redis)