作者:常依sunrise | 来源:互联网 | 2023-08-12 13:29
1、redis的缓存一致性问题=缓存中的数据和数据库中的数据如何保证一致性?
一、redis的常用的两种模式
注意以下两种模式,在大并发下,都会存在一定的漏洞。
1.1、双写模式
修改数据库的同时,修改缓存。如果有两个并发同时进行,第一个修改数据库后有延缓(由于各种原因导致的),在这期间第二个修改进行,紧接着第二个的修改缓存进行。导致第一个修改缓存最后执行,导致了脏数据的出现。
![在这里插入图片描述](https://img8.php1.cn/3cdc5/187ec/807/f862000f3ab505a2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk4MzQxMQ==,size_16,color_FFFFFF,t_70)
1.1.1、双写模式的解决方案一------------>加锁的方式
可以通过加锁的方式,将写数据库和写缓存这两个操作加锁实现。一组 写数据库和写缓存 执行完,才执行第二次。
1.1.2、双写模式的解决方案一------------>加锁的方式
1.2、失效模式
![在这里插入图片描述](https://img8.php1.cn/3cdc5/187ec/807/991d45827ab21035.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk4MzQxMQ==,size_16,color_FFFFFF,t_70)
二、精细的解决方案
通过canal来解决,可以省去编码的复杂,只需编写 写数据库的操作即可。因为canal可以主动的去更新redis
![在这里插入图片描述](https://img8.php1.cn/3cdc5/187ec/807/e6234bd3686050b0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk4MzQxMQ==,size_16,color_FFFFFF,t_70)
三、通过canal来解决
![在这里插入图片描述](https://img8.php1.cn/3cdc5/187ec/807/d34a00242b028f51.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk4MzQxMQ==,size_16,color_FFFFFF,t_70)