Redis如何保证缓存数据一致性
一致性问题主要包含两种情况
- 缓存中有数据,那么缓存中的数据需要和数据库中数据的值相同
- 缓存中本身没有数据,那么数据中的值必须是最新值
除此之外就是缓存不一致问题了
解决一致性问题首先要根据缓存读写模式(读写缓存、只读缓存)来进行分析
读写缓存(对缓存进行增删改)时有两种方法
- 同步直写
写缓存时也同步写数据库,缓存和数据库中的数据一致
- 异步写回
写缓存时不同步写数据库。如果数据还没写回到数据库缓存发生故障,会造成数据丢失,数据库中不是 最新数据的情况
只读缓存
对于只读缓存来说,如果有数据新增则直接在数据库中完成,如果有数据删改则把缓存中的数据标记为无效,再次请求数据时无法从缓存中获取,就会直接请求数据库
- 新增数据时,数据会直接写入到数据库中,不需要对缓存进行操作,此时缓存中没有最新值,数据库中有最新值,所以这时候缓存和数据库中的数据是一致的
- 删改数据时
-
- 当删除数据时
-
- 如果先对缓存中的数据进行了删除,数据库中的数据没有完成删除,缓存中的数据缺失,然后会请求数据库,这时候数据库中的值为旧值,请求到的就是旧值。
- 如果先对数据库中的值进行删除,缓存中的数据没有完成删除,后续的数据请求就会直接请求到缓存中的数据,仍然存在缓存一致性问题。
在只读缓存中,如果要保证缓存一致性,我们可以采用重试机制来进行。可以把要删除的缓存值或者更新的数据值存入到消息队列中。当没有成功的删除缓存值或者数据库中的值时,可以从消息队列中重新读取这些值,然后再进行删除或者更新。如果成功的进行了删除或者更新则将这些值从消息队列中去除避免重复操作。如果尝试了一定次数,还是没有成功则向业务层发送报错信息。