🍰 个人主页:不摆烂的小劉
🍞文章有不合理的地方请各位大佬指正。
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️
Redis
作为缓存时,经常会遇到一些异常问题,概括来说有 4 个方面:缓存中的数据和数据库中的不一致
缓存与数据库的数据一致性
缓存和数据库数据一致的情况:
- 缓存中有数据,缓存的数据值需要和数据库中的值相同。
- 缓存中本身没有数据,数据库中有数据
数据更新的操作模式:
- 先删除缓存值,后更新数据库
- 先更新数据库值,后删除缓存值
先删除缓存再操作数据库
正常情况如下:
并发情况,数据不一致的条件:
- 两线程并行执行
- A线程删除缓存,B线程查询数据库再写入到缓存中,A线程更新数据库
- 结果
数据库v=20
redis v=10
先操作数据库,再删除缓存
正常情况
数据不一致的条件:
- 两线程并行执行
- 恰好缓存失效
- A线程查询完数据库,写入缓存这段时间内,B线程更新数据,删除缓存。
【概率极低,从数据库取出数据到写入缓存的属于微秒级别】
延时双删保证数据一致性
- 在线程 A 更新完数据库后,
sleep
一段时间,再进行一次缓存删除。 - 加上
sleep
时间目的是让线程 B 能够先从数据库读取数据,再把缺失的数据写入缓存,然后,线程 A 再进行删除。所以,线程 Asleep
的时间,就需要大于线程 B 读取数据再写入缓存的时间。
如何评估sleep的时间?
- 根据具体业务场、读取数据量估算sleep的时间
小结:
优先使用先更新数据库再删除缓存的方法。先删除缓存值再更新数据库,有可能导致请求因缓存缺失而访问数据库,给数据库带来压力,而且读取到旧数据的概率较大。
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️