乐观锁与悲观锁-Redisson-存储和数据库符合性

原创
小哥 3年前 (2022-11-09) 阅读数 89 #大杂烩

双写模式:写入数据库后,更新缓存。
问题:当并发时,1、2两个线程写入并完成写入DB在所有写缓存之后,1先进的2后来进来了,2线程写redis比1很快,它将导致临时脏数据(1给2缓存已覆盖)。
解决方案:通过锁定确保并发读写,并在写入时按顺序排列。你读了也没关系。因此,适合使用读写锁。(业务不是核心数据,允许忽略临时脏数据)

失败模式:写入数据库后,在等待下一个查询时删除缓存并缓存数据。
问题:网络或i/o该问题导致第三个请求获取数据库中的数据:db-1此时,第二个请求数据库写入更新。db-1->db-2一旦完成,缓存将立即删除,第三个请求(读取请求)将缓存刷新为第一个请求时的数据。

仍然会有脏数据问题:最终不一致
解决方案:缓存集过期时间,定期更新
解决方案:写入数据时,添加分布式读写锁。

如图:
双写模式(写和写并发问题)

故障模式(写入和读取并发问题)

摘要(三种解决方案粗体):

如果是用户纬度数据(订单数据、用户数据),这种并发概率很小,不要考虑这个问题, 缓存数据加上过期时间,每隔一段时间触发读取活动更新.

如果是菜单、商品介绍等基础数据,也可以去。 使用canal订阅binlog的方式 缓存数据+过期时间 它还足以满足大多数服务的缓存要求。

通过 锁定确保并发读写 写作时按顺序排列。你读了也没关系。因此,适合使用读写锁。(业务不是核心数据,允许忽略临时脏数据);

补充:
我们可以放入缓存中的数据不应该是实时的,并且极其一致。因此,在缓存数据时,添加过期时间以确保您每天都能获得最新的数据。
我们不应该过度设计,增加系统的复杂性
对于实时性和一致性要求较高的数据,即使数据库速度较慢,也应该检查数据库。

我们的系统一致性解决方案是:
1所有缓存的数据都有一个过期时间,数据过期时的下一个查询将触发活动更新。
2读写数据时,添加分布式读写锁。(一定要少写多读,否则会太影响性能。读相当于没有锁,读就好,少写就好)

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除