如何保证缓存与数据库的双写一致性
一、涉及到的操作
缓存:读、写、更新、删除,这些操作可能失败
数据库:读、写、更新、删除,这些操作可能失败
二、正常流程
1. 读数据,先读缓存,命中返回数据;未命中读数据库,返回数据,写缓存;读数据不存在不一致问题
2. 写数据库,对缓存不做处理
3. 更新数据库数据,如果数据不在缓存中,不作处理;如果数据在缓存中,删除而不是更新缓存
a. 有些缓存中的数据,是经过处理后的数据,如果更新会消耗计算资源
b. 如果频繁更新,却没有读取,就会浪费计算时间和内存空间
4. 删除数据库数据,如果数据不在缓存中,不作处理;如果数据在缓存中,删除缓存
三、初级的数据不一致问题
更新数据库数据的时候,如果更新数据库数据成功,删除缓存数据失败,则数据不一致
四、解决方法:更新数据库数据时,先删除缓存,可以保证一致性
a. 如果删除缓存失败,则更新失败
b. 如果删除缓存成功,但是更新数据库失败,则缓存中没有数据,数据库是旧数据
五、复杂的数据不一致的问题
在删除缓存后,更新数据库还未成功,此时有请求读取数据库旧数据,并把旧数据写入了缓存,然后更新数据库成功
六、解决方法
设置缓存过期时间,保证最终数据一致性