redis缓存延时双删指的是什么

缓存为啥是删除,而不是更新?

在更新数据时,可能会遇到分布式事务问题,导致缓存更新成功但数据库修改失败。即使在数据库修改失败的情况下,仅删除缓存,下次查询仍会直接从数据库获取数据,不会产生脏数据。

延时双删是什么?

Redis缓存延时双删指什么为什么需要它

就是在增删改某实体类的时候,要对该实体类的缓存进行清空,清空的位置在数据库操作方法的前后。

采用反证法

只先删

只后删

结论

从而得出 前删和后删都有问题。所以采用延时双删的策略

思考2:为啥是延时

依然是反证法。下图这情况是双删依然存在旧缓存的情况,延时是确保 修改数据库-》清空缓存前,其他事务的更改缓存操作已经执行完。

补充:为什么要延迟双删,来保证缓存一致性

为什么要延迟双删,来保证缓存一致性

  • 在修改数据库数据前,需要先删除一次redis:此时是为了保证在数据库数据修改和redis数据被删除的间隔时间内,如有命中,保证此数据也不存在redis中。如果没有进行删除操作,当数据库数据已经被修改后,仍然可以从redis中读取旧数据,这将导致数据不一致。

  • 第二次删除则是在修改数据库数据后,此时需要再次删除redis中对应数据一次,这一次是为了删除 第一次redis删除和数据库数据修改之间,如果有请求,那么旧数据又会重新缓存到redis中,然而数据在数据库中在接下来就会被修改,如果没有这一次删除,redis中则会存在数据库中旧的数据。

  • 那么第二次为什么需要在数据库修改后延迟一定时间再删除redis呢?

  • 为了等待之前的一次读取数据库,并等待其数据写入到缓存,最后删除这次脏数据,所以是一次数据从数据库中发到服务器+缓存写入的时间

但是延迟双删,所延迟的时间非常的难以确定,所以并不推荐延迟双删

根据综合考虑,即使先修改数据库,在删除缓存,有一定的时间会导致读取到旧数据,这通常是可以被忍受的。只要及时将缓存删除,其他线程就可以读取到最新的值。

同时为了保证缓存一定会被删除,可以采用mq,来保证缓存会被删除

如果在mq中消息没有被重复消费,还会交由给其他消费者消费(将缓存删除)



Redis是一种开源的Key-Value存储系统,在很多应用中用来做缓存,它的高速性和灵活性令使用它的应用越来越多。但是,当我们在使用Redis缓存的时候,会遇到一个问题,也就是缓存的更新问题。本篇文章将会详细讨论Redis缓存延时双删的概念和它的使用场景。
1.何谓Redis缓存延时双删
Redis缓存延时双删是一种处理缓存更新问题的方法,它的核心思想就是延时删除缓存。当从数据库中更新数据时,我们无法直接删除Redis缓存,因为对于一些高并发系统,可能会有很多用户同时对同一个资源进行操作,如果在更新数据之后立即删除缓存,会导致一部分用户在获取数据时仍然拿到了旧数据,这显然不是我们想要的结果。因此我们需要通过延时删除缓存来解决这个问题。
2.Redis缓存延时双删的实现方式
Redis缓存延时双删的实现方式可以分为两个步骤。第一步是在更新数据之后将需要删除的Redis缓存的Key保存在一个List数据结构中,第二步是在一定时间后再去批量删除这些Key所对应的Redis缓存。
具体实现可以通过以下步骤:
(1)当数据库中的数据被更新时,我们需要将对应的Redis缓存的Key保存在一个List数据结构中;
(2)当需要使用缓存数据时,我们可以先从Redis缓存中获取数据,如果数据不存在,再从数据库中获取数据;
(3)当需要更新缓存时,我们首先需要更新数据库中的数据,更新过程中需要保留原来的缓存Key,否则在更新数据之后会导致并发问题;
(4)当更新完数据库中的数据后,我们需要将需要删除的缓存Key保存到一个List数据结构中;
(5)我们可以通过定时任务或者消息队列等方式,在一定时间后批量删除这些缓存Key对应的Redis缓存。
3.场景说明
Redis缓存延时双删适用于那些写入频繁,读取不频繁的应用,它的优势是能够避免用户获取旧数据的问题,从而提高了系统的可用性。同时,使用Redis缓存延时双删还能够有效地降低数据库的压力,从而提高了系统的性能。
总结
Redis缓存延时双删是一种解决Redis缓存更新问题的实现方式,它的核心思想是通过延时删除缓存来避免用户获取旧数据的问题。使用它能够提高系统的可用性和性能,适用于那些写入频繁,读取不频繁的场景。希望本篇文章能够为大家提供对Redis缓存延时双删概念的深入了解。