就是缓存和数据数据一致性?

先操作数据库,还是先操作缓存

为什么

因为先操作缓存,操作数据库报错,缓存又不能回滚。保证数据的一致性

删除缓存还是更新缓存

删除缓存

为什么

更新缓存,或许有无效操作。一次都没操作,又更新了,比如更新了缓存,10分钟没有人用,但是又修改数据,又要改缓存。

删除缓存

下次查询缓存,缓存没有数据,便会去数据库中查。

但是在并发情况也会发生问题

上述只能在单线程情况下,并发就不可以。

就延迟双删,缓一缓,不要那么急,解决并发问题。反正就是容易读到老数据,改数据的时候,读比较快,容易读到老数据。

一个查一个写,查的时候读老数据,另外一个又在写,数据就不一致了。刚好请求b将新值写入数据,请求b删除缓存后,刚好请求a写入缓存。(后续请求访问到又是老数据)

就是那么多刚好。

在并发情况下,为了解决数据一致,要采用双写一致性

延迟双删

延迟一段时间后,再删除缓存,在第一次删除缓存后,延迟一段时间后,再删除一次缓存。

不解决:有些公司他认为在并发情况下,一定不会发生数据不一致,因为他们认为读比写快。

同步延迟:第一次删除缓存,睡眠一会儿,再删除一次缓存。 

响应时间长:用户体验度不好

异步延迟:

在第一次缓存删除之后,另开一个线程,执行第二次缓存删除。 线程池

睡眠再删除第二次,使用线程池单开线程。第二次失败怎么办,再次尝试删除,如果失败再尝试几次。

消息队列延迟:可以事务消息+sleep,或者延迟消息 这个有重试,重试16次扔到死信队列去。为什么要事务消息,因为第一次成功才第二次

这延迟双删总让人不由而然想到es双写,感觉异曲同工之妙。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部