缓存一致性问题

本文探讨了在项目中遇到的缓存一致性问题,分析了先删除缓存再提交事务(A-B)和先提交事务再删除缓存(B-A)的优缺点,并提出了通过加锁、补偿机制、事务消息等方案来保证一致性。实践中,对于并发量少的情况采用A-B-A策略,高并发秒杀场景则在更新缓存时直接扣减库存,同时利用定时任务进行补偿。对于查询并发量大的普通缓存,建议使用缓存读写分离以避免阻塞。
摘要由CSDN通过智能技术生成

一.场景

项目中为了对dao(data access object)层数据做缓存,设计了一层das(data access service),在das上采用了aop的方式作统一缓存处理。这里做的是缓存删除操作。

二.问题

数据库和缓存的一致性问题。

三.定义

A: 删除缓存
B: 提交数据库事务
C: 读取缓存(如果缓存数据为空,会从数据库读取旧数据)
A-B: A和B同步
A–B: A和B异步

四.分析

1.顺序异常分析

1.1 先A后B

注意:删除缓存的操作在数据库事务中执行的情况也属于先A后B
(1)A失败了,B不会执行,不影响一致性。
(2)A成功了,B失败了。因为是删除缓存操作(读请求会从数据库读取旧数据),所以不影响一致性。
(3)先A,后B,存在时间间隙,如果在这段间隙中有其它读请求C,那么就会出现数据不一致。

1.2 先B后A

(1)B失败,A不会执行,不影响一致性。
(2)B成功,A失败,会出现数据不一致。

1.3小结

从上面分析可以发现,两种顺序的执行都会存在导致数据不一致的问题。

2.方案分析

2.1先A后B

解决问题(3)
(1)阻塞加锁的方式,A-B。优点:保证强一致,缺点:性能不高,高并发情况不适合,缓存读写阻塞不好实现。
(2)在B操作中加入数据库持久化日志,使用定时任务补偿,A-B–AA-B同步(并发不高情况下,可以降低C执行的概率),B–A异步(补偿)。优点:基本不影响缓存性能,缺点:增加日志数据和定时任务的开销。

2.2先B后A

解决问题(2)
(1)在B操作中加入数据库持久化日志,使用定时任务补偿,B-A–A,原理跟上面第(2)点一样。
(2)事务消息,生产者事务生产和消费者事务消费,B操作中需要加入数据库持久化日志,异步A操作,定时任务做MQ补偿,B–A。优点:异步队列处理性能高,操作解耦,适合A操作量大的情况,缺点:转移到解决MQ一致性的问题上,而且还增加日志数据、定时任务和MQ的开销。

2.3小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值