This topic created in 948 days ago, the information mentioned may be changed or developed.
Redis 服务挂了,一段时间后又恢复,如果这段时间能内,有修改数据库的操作,不会造成缓存与数据库不一致吗?
如果是 Redis 主从集群,能避免这种情况吗?集群全挂了呢?
注:目前解决缓存与数据库一致所使用的方案,是双写方案,写操作-先写数据库再删缓存,读操作-有缓存就读缓存,无缓存就读数据库后重建缓存
但这种方案的问题是,缓存服务挂了后,在写操作时无法删掉过期缓存,最后等缓存服务恢复,读操作读到的就是过期数据
请老哥们指点一下,
难道因为缓存服务挂掉,就拒绝一切写操作吗?
11 replies • 2023-10-22 16:21:02 +08:00
 |
|
2
calmzhu Oct 21, 2023
加个监控啊,挂了恢复前清下缓存。
|
 |
|
3
crysislinux Oct 21, 2023 via Android
集群挂了还说啥,站点就 down 呗。用 Redis 集群的站 Redis 挂了基本也没法儿提供服务了
|
 |
|
4
devopsdogdog Oct 21, 2023 via Android
好好想想缓存是不是这样用,你都写 mysql 了,redis 不写就好了,只靠读的时候缓存一下。
缓存数据一般不用于这种需要强一致性的。
|
 |
|
5
HuLiY Oct 21, 2023
双写方案,写操作-先写数据库再删缓存,读操作-有缓存就读缓存[并设置一个合适的过期时间],无缓存就读数据库后重建缓存 👆就可以了。 过期时间最好是随机的,避免缓存雪崩。 这种方案一般用于一致性要求低的场景。
|
 |
|
6
HuLiY Oct 21, 2023
-----------上一条写错了---------------- 双写方案,写操作-先写数据库再删缓存,读操作-有缓存就读缓存,无缓存就读数据库后重建缓存[并设置一个合适的过期时间] 👆就可以了。 过期时间最好是随机的,避免缓存雪崩。 这种方案一般用于一致性要求低的场景。
|
 |
|
7
EarthChild Oct 21, 2023
那就做个标识啊,redis 读/写不成就做个标识,等读出来了,这个标识为 true ,就清空 redis 缓存,每次读/写 redis 前都判断一下这个标识都行了。
|
 |
|
8
kuituosi Oct 22, 2023
严格来说就没有方法保证一致性,不管是双写还是集群。 对一致性要求高就不要缓存,普通的情况把过期时间设置足够短就可以
|
 |
|
9
julyclyde Oct 22, 2023
再恢复的时候它应该是空白的,然后逐渐被双读操作给填充出来 而不是持有死之前那一份数据
|
 |
|
10
hangszhang Oct 22, 2023
试试 binlog 同步到 redis 的方案
|