定时刷新缓存失效问题

文章描述了一个技术问题,即后台更新的运营banner数据未能同步到前端,原因是更新操作未正确删除Redis缓存,并且分布式锁机制存在缺陷导致缓存无法及时刷新。解决方案包括升级Redis库和改变分布式执行机制,以确保数据一致性。
摘要由CSDN通过智能技术生成
问题描述

运营在管理后台新建了运营banner等类型的数据,更新状态上线,前端并没有拿到最新的banner,

管理后台的增删改查操作都会去delete cache,下次数据进入到缓存,要么定时任务刷新,要么是用户访问接口代码主动加载相应数据到缓存

查看数据库banner数据记录状态正常,但redis并没有把最新的运营数据加载进来,db跟redis缓存数据不一致。

问题分析

运营操作流程,管理后台插入数据(状态默认下线) → 更新状态上线, 排查管理后台操作业务相关代码,发现BUG,看代码:

上图,运营操作上线了,这里没有加运营数据类型,导致没法删除redis缓存,但是我们有定时器TimerRefreshCache定时刷新redis缓存,为何也没加载最新的数据,我们进一步跟进

看配置知道缓存失效时间 7d:604800 下次刷新缓存时间30秒 30

涉及到分布式环境,定时器执行仅需其中一台机器跑,所以当前是用的redis nx机制 排斥其他服务器线程执行

查看redis服务器上 分布式锁的 过期时间,似有被实时ttl 60的操作,如下图

查看代码,果然有诈,并发情况下,所有线程在第一步只会有一个设置成功,但是在第二步所有线程都会去执行并生效,这也是 分布式锁一直存在,不会失效

锁不会失效,就大家都不会拿到 tryLockSuccess=false,就不会执行下面刷新缓存动作

但是这里第一个能执行刷新逻辑的线程会在这里删除 redis上的锁,按理来说后面的线程又有机会了,目前情况来看,某次执行刷新缓存过程中这个删除肯定是没有做到的,线上问题复杂目前还不能很好解释

反正分布式锁的过期时间是居高不下的,定时任务或许第一次执行成功之后都没能执行刷新

问题解决

1、升级目前的common-redis版本,使用 setNXAndExpire(key, value, ttl),

2、转变这个分布式执行机制,

使用redis分布式锁的这种方式,还是避免不了分布式服务器去抢占redis和执行命令,可以完全去redis,

通过在配置文件中 配置参数,指定执行定时任务的机器来允许指定机器执行刷新

比如:config.refresh.running.server.ip=指定IP

1、这样可以明确知道哪台服务器跑执行动作,出了问题好定位机器,redis分布式的情况下不能很好的知道是哪台机器执行

2、减少不必要的redis交互和锁争夺,每台机都是定时去执行,一天下来访问和请求redis量还是比较大,而且都是用处不大的请求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值