redis之5如何保证数据库与缓存的数据一致性
前置
Mysql 做数据库 redis做缓存
如何保证数据库与缓存的数据一致性?
cache aside pattern
1.命中:程序先从缓存中读取数据,如果命中,则直接返回
2.失效:程序先从缓存中读取数据,如果没有命中,则从数据库中读取,成功之后将数据放到缓存中
3.更新:程序先更新数据库,在删缓存。
先更新数据库,再删除缓存, 是不是就没有问题?
假设这会有两个请求,一个请求A做查询操作,一个请求B做更新操作,那么会有如下情形产生
(1)缓存刚好失效
(2)请求A查询数据库,得一个旧值
(3)请求B将新值写入数据库
(4)请求B删除缓存
(5)请求A将查到的旧值写入缓存
ok,如果发生上述情况,确实是会发生脏数据。
发生上述情况有一个先天性条件,就是步骤(3)的写数据库操作比步骤(2)的读数据库操作耗时更短,才有可能使得步骤(4)先于步骤(5)。可是,大家想想,数据库的读操作的速度远快于写操作的(不然做读写分离干嘛,做读写分离的意义就是因为读操作比较快,耗资源少),因此步骤(3)耗时比步骤(2)更短,这一情形很难出现。
方案
1.单sql情况下,可做延时删除。 (延时如果出现服务挂了,未删除缓存) (弱一致性)
2.多sql事务情况下,可使分布式锁,读请求发现缓存没有时要去获取锁。写请求和读请求用一把锁。(加锁了,响应就慢了)(强一致性)
3.异步删除(在异步这段时间,数据是不一致的)(最终一致性)
redis之5如何保证数据库与缓存的数据一致性
http://hanqichuan.com/2022/05/17/redis/redis之5如何保证数据库与缓存的数据一致性/