首页 > 其他分享 >记一次缓存一致性中延迟双删的使用场景

记一次缓存一致性中延迟双删的使用场景

时间:2023-09-23 16:34:11浏览次数:27  
标签:缓存 删除 双删 预警 数据库 线程 一致性

1、背景:

 前边写了个这样的业务需求:从算法服务那边会不断的发送过来一些预警的数据和预警恢复的数据,当有新预警数据过来时,会进行数据库记录和redis缓存,当有该预警的恢复过来时会将数据库状态修改并清除缓存,我的做法是使用了缓存双删的策略,即先删缓存,再更新数据库,再删缓存。

但是此时还是出现了问题,就是页面上某个使用我缓存的地方出现了显示的不正确,经过查询,发现数据库里这条数据已经是恢复状态,但是缓存里还是有预警,这就是数据库和缓存不一致导致的问题,比较老生常谈了。

2、方案:

经过排查,发现是我在进行第二次删除缓存的时候,并没有进行延迟,这就可能会出现问题,主要出问题的逻辑如下:

A线程在收到预警恢复的数据后,先删除了缓存,此时B线程过来查询,发现缓存中没有数据,则查数据库,但是还没更新缓存,此时B线程的时间片用完,轮到A线程进行更新数据库操作,A顺利的更新了数据库,然后A线程执行了第二次删除缓存操作,但是缓存中其实还没有数据,所以A其实删除了个空,此时B线程继续执行,B线程将数据库中查到的旧值更新到了缓存中,这就导致缓存和数据库不一致。

所以我再第二次删除缓存处加了个线程sleep100ms,但是其实还是有问题,我应该让线程sleep多长时间才合适呢?这个问题我并没有深究,等有空了再详细研究一下吧。

标签:缓存,删除,双删,预警,数据库,线程,一致性
From: https://www.cnblogs.com/Silentness/p/17724525.html

相关文章

  • UE4之DDC缓存
    什么是DDC(DerivedDataCache)?简单来说,是一些缓存文件。在使用Editor的过程中,有可能会在编辑某些文件,或者使用某些文件的时候产生额外的数据。为了避免每次都需要重新产生一次数据,所以第一次产生完数据之后,会将数据序列化,并以缓存的形式保存下来。DerivedDataCache目录包含了为引用......
  • springboot项目可以是那些缓存技术
    SpringBoot项目可以使用多种缓存技术,下面列举了一些常见的缓存技术以及它们的优缺点:Redis:优点:Redis是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。其读写速度非常快,因为数据存储在内存中。Redis支持丰富的数据类型,如字符串、列表、集合、哈希、有序集合等,可以满足不同......
  • Kafka的消息传递保证和一致性
    前言通过前面的文章,相信大家对Kafka有了一定的了解了,那接下来问题就来了,Kafka既然作为一个分布式的消息队列系统,那它会不会出现消息丢失或者重复消费的情况呢?今天咱们就来一探。实现机制Kafka采用了一系列机制来实现消息传递的保证和一致性,关键点:至少一次的消息传递(AtLeastOnceD......
  • 三大缓存问题
    三大缓存问题缓存穿透什么是缓存穿透?怎么解决?缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数......
  • Mybatis二级缓存
    Mybatis二级缓存还记得我们在学习Mybatis讲解的缓存机制吗,我们当时介绍了二级缓存,它是Mapper级别的缓存,能够作用与所有会话。但是当时我们提出了一个问题,由于Mybatis的默认二级缓存只能是单机的,如果存在多台服务器访问同一个数据库,实际上二级缓存只会在各自的服务器上生效,但是我......
  • Kafka的消息传递保证和一致性
    前言通过前面的文章,相信大家对Kafka有了一定的了解了,那接下来问题就来了,Kafka既然作为一个分布式的消息队列系统,那它会不会出现消息丢失或者重复消费的情况呢?今天咱们就来一探。实现机制Kafka采用了一系列机制来实现消息传递的保证和一致性,关键点:至少一次的消息传递(AtLeas......
  • ClickHouse数据缓存与性能优化技术实现最佳实践与案例
    前言ClickHouse是一款高性能的列式存储数据库,它的性能在处理海量数据时非常出色。但是,在实际应用中,我们还需要考虑如何进一步优化ClickHouse的性能,特别是在数据缓存方面。本文将深入探讨ClickHouse的数据缓存与性能优化技术实现最佳实践与案例。ClickHouse数据缓存ClickHouse的......
  • java中如何保证数据库数据的一致性
    本文使用的数据库是mysql一、不考虑并发时的写法假设现在有一张t_product表,我们先只考虑单实例部署时的情况CREATETABLEt_product(idINTPRIMARYKEY,NAMEVARCHAR(50),numsINT);INSERTINTOt_product(id,NAME,nums)VALUES(1,'aa',1);我们现在有一个加库存的接口......
  • Docker缓存占有太大的磁盘空间
    Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加。查出占用磁盘较大的文件Docker的日志文件存在/var/lib/docker/containers目录中,通过下面的命令可以将日志文件夹根据升序的方式罗列出来。sudodu-d1-h/var......
  • 【Spring使用三级缓存解决循环依赖的过程】
    testService1和testService2相互依赖当Spring创建testService1对象时,它会先从一级缓存中查找是否存在testService1的实例。如果缓存中不存在testService1实例,它将继续查找二级缓存中是否存在testService1。如果二级缓存中也不存在testService1实例,则Spring会尝试从三级缓存中获取......