数据库与缓存一致性

149 阅读1分钟

一、先删除缓存,后修改数据库 一个写的操作先进来,把缓存删除了; 在写操作还没有更新数据库的时候,一个读的请求又进来了,发现没有命中缓存,就去数据库把老数据取出来了; 写操作更新了数据库; 读操作把老数据放在了缓存中 存在问题

二、先修改数据库,后删除缓存 读操作先进来,发现没有缓存,去数据库中读数据,这个时候因为某种原因卡了,没有及时把数据放入缓存; 写的操作进来了,修改了数据库,删除了缓存; 读操作恢复,把老数据写进了缓存。 这样就造成了数据库、缓存不一致,不过,这个概率出现的非常低。

三、延迟双删 延迟双删就是先删除缓存,后修改数据库,最后延迟一定时间,再次删除缓存。

四、内存队列或第三方队列(RabbitMQ、Kafka) 1、队列删除缓存:写操作只是修改数据库,然后把数据的Id放在内存队列里面,后台会有一个线程消费内存队列里面的数据,删除缓存,如果缓存删除失败,可以重试多次。 2、修改数据库和删除缓存两个操作解耦了,如果删除缓存失败,也可以多次尝试。由于后台有一个线程去消费内存队列去删除缓存,不是直接删除缓存,所以修改数据库和删除缓存之间产生了一定的延迟,这延迟应该可以保证读操作已经执行完毕了。