Redis作为缓存,双写一致性怎么保证?

就是问:缓存里数据怎么保证跟数据库里面的一致呢

我们探讨一下这几种方案

1 先删除缓存在更新数据库

在【删除缓存之后】【更新数据库之前】来了一个请求,然后缓存获得了老的数据,数据库更新了,不一致发生了

2 先更新数据库,再删除缓存

这样,缓存在数据库更新后再更新,总能一致了吧。

我们假设:在【修改数据库之前】,此时缓存刚好失效,另一个请求进来发现缓存不存在,就会从数据库中读取数据,但是【读取完了还没放到缓存中】,此时发生了【修改数据库+删除缓存】的操作,然后【读取的老数据放到了缓存中】,这样就出现了不一致。

个人感觉:【修改数据库+删除缓存】时间 远大于【数据放到缓存中】,这种情况已经很安全了。

但是还有更安全的

3 延时双删

1、先删除缓存

2、再写数据库

3、休眠500ms(根据统计线程读取数据和写缓存的时间) (休眠的作用是当前线程等其他线程读完了数据后写入缓存后,删除缓存)

4、再删除缓存

重生之八股仙帝 文章被收录于专栏

曾有一千古奇人,精修八股文,成遁世之高人,彻天彻地畅游天地间。 今人皆忙忙,急于求成,岂不知八股乃道门口径,背负天人,若经熟读背诵,更能开拓智慧之门,探寻未来之路。 天下繁华,不尽长夜,唯有读书为伴,熟读八股文更是攀登高峰之路。磨砺文字,升腾智慧,唯有勤玉立志,始可破天荒,登临九重不竭之巅! 吾辈修炼之路,虽曲折荆棘,但信念不曾磨灭,唯有铭记八股精髓,方能指引灵魂归宿,成就一生辉煌!

全部评论

相关推荐

核心本地商业-业务研发平台4月9日1:面试官自我介绍+自我介绍2:Spring源码讲一下3:Spring源码学完什么收获4:spring的事务了解吗?,mysql的事务呢?5:spring的事务和mysql的事务有什么联系?6:项目jdk什么版本?7:默认垃圾回收器是什么?8:介绍一下ZGC和G1?9:项目性能调优怎么做的?垃圾回收器参数,jvm参数,10:Seata分布式事务?11:其他分布式事务了解吗?(模模糊糊说了MQ)12:AT和TCC说一下?13:看过12306官方的实现吗?14:既然你看过一些实现,那么你想怎么优化呢?(答了锁粒度方案,和redis方案)15:redis方案的一致性怎么解决?(答了cannal,MQ)16:redis网络波动,用于以为下单失败,但是其实redis收到消息怎么办?(当时说的MQ,但是面试官想说的不是这个,后面复盘应该是本地消息表+定时任务)17: 项目数据库方面有什么优化?(联合索引,explan,慢查询日志,skywalking)18:加完索引,前端需要注意什么?19:数据库的什么字段适合加索引 ,什么字段不适合? 20:Hashmap源码看过吗21:Hashmap多个线程put有什么问题?(值覆盖,极端情况下数组越界)22:值覆盖举个例子?23:极端情况下数组越界什么意思?24:还有其他的情况吗?(最后答了链表和红黑树可能会空指针异常)25:多线程用什么替代?(concurentHashmap)26:concurentHashmap1.7和1.8区别?27:concurentHashmap1.7为什么用了CAS?28:concurentHashmap1.8怎么实现?(乐观和悲观两种情况)29:1.8里的volatile是什么?30:volatile能解决线程安全问题吗?(不能)31:那能解决什么问题?32:SQL题,单表topk,审错题意了,写了快20分钟用子查询才写出来,然后面试官说有没有其他方法,又写了10分钟33:大模型相关问题,agent,Transfomer34:反问全称1小时40分钟,汗流浃背,后面写SQL的时候脑子已经不转了。二面4月15日1:深挖项目(20分钟)2:Redission怎么实现的?3:为什么不用redis的setnx?4:数据库分库分表,分库分表会有什么问题?(说了一下怎么分库分表,有什么问题没打上来)5:某个服务器cpu飙高怎么排查(top,htop,ps, jstake, dump文件,visualVM)6:优化sql?(skywalking,慢查询日志,索引,elplain的字段)7:深度分页优化?(业务上不允许深度分页,子查询,索引查询,游标分页)反问#牛客AI配图神器#二面完,感觉g了,面试官说项目没选好,mysql没有分库,不太像分布式项目。
这名字响亮不响亮:我去,spring是你简历写的熟悉源码嘛,还是面试官直接问的嗷。好可怕
点赞 评论 收藏
分享
评论
2
13
分享

创作者周榜

更多
牛客网
牛客企业服务