Redis 服务挂了,一段时间后又恢复,不会造成缓存与数据库不一致吗?

2023-10-21 11:27:12 +08:00
 yodhcn
Redis 服务挂了,一段时间后又恢复,如果这段时间能内,有修改数据库的操作,不会造成缓存与数据库不一致吗?

如果是 Redis 主从集群,能避免这种情况吗?集群全挂了呢?


注:目前解决缓存与数据库一致所使用的方案,是双写方案,写操作-先写数据库再删缓存,读操作-有缓存就读缓存,无缓存就读数据库后重建缓存

但这种方案的问题是,缓存服务挂了后,在写操作时无法删掉过期缓存,最后等缓存服务恢复,读操作读到的就是过期数据


请老哥们指点一下,
难道因为缓存服务挂掉,就拒绝一切写操作吗?
2112 次点击
所在节点    Redis
11 条回复
justthewayyouare
2023-10-21 11:50:35 +08:00
不用 redis 就行了。
calmzhu
2023-10-21 11:53:52 +08:00
加个监控啊,挂了恢复前清下缓存。
crysislinux
2023-10-21 12:34:53 +08:00
集群挂了还说啥,站点就 down 呗。用 Redis 集群的站 Redis 挂了基本也没法儿提供服务了
devopsdogdog
2023-10-21 18:49:29 +08:00
好好想想缓存是不是这样用,你都写 mysql 了,redis 不写就好了,只靠读的时候缓存一下。

缓存数据一般不用于这种需要强一致性的。
HuLiY
2023-10-21 19:26:22 +08:00
双写方案,写操作-先写数据库再删缓存,读操作-有缓存就读缓存[并设置一个合适的过期时间],无缓存就读数据库后重建缓存
👆就可以了。
过期时间最好是随机的,避免缓存雪崩。
这种方案一般用于一致性要求低的场景。
HuLiY
2023-10-21 19:27:24 +08:00
-----------上一条写错了----------------
双写方案,写操作-先写数据库再删缓存,读操作-有缓存就读缓存,无缓存就读数据库后重建缓存[并设置一个合适的过期时间]
👆就可以了。
过期时间最好是随机的,避免缓存雪崩。
这种方案一般用于一致性要求低的场景。
EarthChild
2023-10-21 20:11:45 +08:00
那就做个标识啊,redis 读/写不成就做个标识,等读出来了,这个标识为 true ,就清空 redis 缓存,每次读/写 redis 前都判断一下这个标识都行了。
kuituosi
2023-10-22 09:33:37 +08:00
严格来说就没有方法保证一致性,不管是双写还是集群。
对一致性要求高就不要缓存,普通的情况把过期时间设置足够短就可以
julyclyde
2023-10-22 13:10:11 +08:00
再恢复的时候它应该是空白的,然后逐渐被双读操作给填充出来
而不是持有死之前那一份数据
hangszhang
2023-10-22 14:56:22 +08:00
试试 binlog 同步到 redis 的方案
9c04C5dO01Sw5DNL
2023-10-22 16:21:02 +08:00
这种场景可以在恢复后先清空缓存,清空后再给应用使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/984010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX