如何保证缓存与数据库的双写一致性

一、涉及到的操作

缓存:读、写、更新、删除,这些操作可能失败

数据库:读、写、更新、删除,这些操作可能失败

二、正常流程

1. 读数据,先读缓存,命中返回数据;未命中读数据库,返回数据,写缓存;读数据不存在不一致问题

2. 写数据库,对缓存不做处理

3. 更新数据库数据,如果数据不在缓存中,不作处理;如果数据在缓存中,删除而不是更新缓存

a. 有些缓存中的数据,是经过处理后的数据,如果更新会消耗计算资源

b. 如果频繁更新,却没有读取,就会浪费计算时间和内存空间

4. 删除数据库数据,如果数据不在缓存中,不作处理;如果数据在缓存中,删除缓存

三、初级的数据不一致问题

更新数据库数据的时候,如果更新数据库数据成功,删除缓存数据失败,则数据不一致

四、解决方法:更新数据库数据时,先删除缓存,可以保证一致性

a. 如果删除缓存失败,则更新失败

b. 如果删除缓存成功,但是更新数据库失败,则缓存中没有数据,数据库是旧数据

五、复杂的数据不一致的问题

在删除缓存后,更新数据库还未成功,此时有请求读取数据库旧数据,并把旧数据写入了缓存,然后更新数据库成功

六、解决方法

设置缓存过期时间,保证最终数据一致性

原文地址:https://www.cnblogs.com/june0816/p/6140626.html