就是缓存和数据数据一致性?
先操作数据库,还是先操作缓存
为什么
因为先操作缓存,操作数据库报错,缓存又不能回滚。保证数据的一致性
删除缓存还是更新缓存
删除缓存
为什么
更新缓存,或许有无效操作。一次都没操作,又更新了,比如更新了缓存,10分钟没有人用,但是又修改数据,又要改缓存。
删除缓存
下次查询缓存,缓存没有数据,便会去数据库中查。
但是在并发情况也会发生问题
上述只能在单线程情况下,并发就不可以。
就延迟双删,缓一缓,不要那么急,解决并发问题。反正就是容易读到老数据,改数据的时候,读比较快,容易读到老数据。
一个查一个写,查的时候读老数据,另外一个又在写,数据就不一致了。刚好请求b将新值写入数据,请求b删除缓存后,刚好请求a写入缓存。(后续请求访问到又是老数据)
就是那么多刚好。
在并发情况下,为了解决数据一致,要采用双写一致性
延迟双删
延迟一段时间后,再删除缓存,在第一次删除缓存后,延迟一段时间后,再删除一次缓存。
不解决:有些公司他认为在并发情况下,一定不会发生数据不一致,因为他们认为读比写快。
同步延迟:第一次删除缓存,睡眠一会儿,再删除一次缓存。
响应时间长:用户体验度不好
异步延迟:
在第一次缓存删除之后,另开一个线程,执行第二次缓存删除。 线程池
睡眠再删除第二次,使用线程池单开线程。第二次失败怎么办,再次尝试删除,如果失败再尝试几次。
消息队列延迟:可以事务消息+sleep,或者延迟消息 这个有重试,重试16次扔到死信队列去。为什么要事务消息,因为第一次成功才第二次
这延迟双删总让人不由而然想到es双写,感觉异曲同工之妙。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 缓存双写一致性(笔记向)
发表评论 取消回复