非要保证数据库和缓存数据强一致该怎么办

如果要保证redis 中数据和mysql 强一致怎么办

今天在思考这个问题。

可以这么做,redis中缓存中,添加 status 和updateTime 。比如

user_cache:{status:0,updateTime:2021-0405-22:25:29:30}

其中 status 只能是0 或者1, 0表示 已更新完,1表示 正在更新中。

所有请求,读缓存后,都要判断这个缓存中的数据是否有效,是否是正在更新中。如果正在更新中,则都在那儿等。(可以参考穿透的逻辑)

所以,更新mysql的逻辑变成:

1.先将 user_cache 的status 更改为 1

2.更新mysql

3.更新redis user_cache的status 更改为0

那么,

1.如果更新mysql成功后,更新cache 中key的 status 失败了怎么办。

这个可以由其它请求完成更新,比如其它请求发现 status 为1,那么再检查 updateTime 是否超过一定的延时,超过了,直接重新recache一次。用mysql覆盖当前缓存。

如果没有超时,则等待。处理逻辑和穿透思想类似。一个app内,只有一个协程进行,其它协程做sync.WaitGroup.wait()。

2.如果更新mysql失败后,程序中断推出了,缓存中的数据status还是1,怎么办。

处理逻辑可以同上。

3.也可以在更新db之前,将cache的expire时间调整,比如3秒之后过期。

4.更极端的方式,每次请求做并发控制,加读写锁。用一个分布式锁。保证写db前,分布式锁为writeLock,。

猜你喜欢

转载自blog.csdn.net/longxibendi/article/details/115449835
今日推荐