redis缓存一致性延时双删代码实现方式

 更新时间:2022年08月26日 14:13:23   作者:彼的猫  
这篇文章主要介绍了redis缓存一致性延时双删代码实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

redis缓存一致性延时双删代码

不废话、、、如下

1、自定义注解

/**
*@author caoyue
*延时双删
**/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
public @interface ClearCache {
    boolean open() default true;
}

2、刪除逻辑

/**
 * @author caoyue
 */
@Component
@Aspect
@Slf4j
public class DoubleClearCacheAop {
    @Autowired
    private UserService userService;
	//声明一个用于延时的定时线程池代替线程sleep
    ScheduledExecutorService task = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory.
            Builder().namingPattern("clearCache-schedule-pool-%d").build());
    @Pointcut("@annotation(com.inspur.henan.uac.modules.open.util.ClearCache)")
    private void clearCachePoint() {
    }
    @Around("clearCachePoint()")
    public Object clearCacheAop(ProceedingJoinPoint proceeds) throws Throwable {
        Method method = ((MethodSignature) proceeds.getSignature()).getMethod();
        ClearCache annotation = method.getAnnotation(ClearCache.class);
        Object proceed = null;
        //如果清除注解开启了
        if (annotation.open()) {
        	//上下文获取信息
            IPubUser user = MsySecurityContextHolder.getUser();
            if (Objects.nonNull(user)) {
            	//执行清除缓存的动作
                userService._clearCache(user);
                //业务处理
                proceed = proceeds.proceed();
                //延时两秒后再删
                task.schedule(() -> {
                    userService._clearCache(user);
                    if (log.isInfoEnabled()) {
                        log.info(Thread.currentThread().getName() + ":double delete cache completed");
                    }
                }, 2L, TimeUnit.SECONDS);
            } else {
                proceed = proceeds.proceed();
            }
        }
        return proceed;
    }
}

redis缓存延迟双删问题

高并发场景使用redis作为缓存存储数据,当数据更新时,如何保证缓存一致性,

延迟双删的策略:

先删除缓存,然后更新数据库数据,休眠sleep,最后再次删除缓存数据。

休眠的时间略微大于从数据库查询数据的时间。

当读写分离时,考虑到主从数据同步延迟,休眠时间约1s。

休眠时间不能太大,否则会影响更新的速度。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Redis中三种特殊数据类型命令详解

    Redis中三种特殊数据类型命令详解

    Geospatial是地理位置类型,我们可以用来查询附近的人、计算两人之间的距离等,这篇文章主要介绍了Redis中三种特殊数据类型命令详解,需要的朋友可以参考下
    2024-05-05
  • Redis连接超时异常的处理方法

    Redis连接超时异常的处理方法

    这篇文章主要给大家介绍了关于Redis连接超时异常的处理方法,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • Java Socket实现Redis客户端的详细说明

    Java Socket实现Redis客户端的详细说明

    socket编程是一门技术,它主要是在网络通信中经常用到.这篇文章主要介绍了如何用Java Socket实现一个简单的Redis客户端,需要的朋友可以参考下
    2021-05-05
  • Redis中key过期策略的实现

    Redis中key过期策略的实现

    Key的过期机制是Redis保持高可用性的重要策略,过期策略分为惰性过期和定期过期,惰性过期在每次访问key时检查是否过期,定期过期则由serverCron方法定时清理过期key,本文就来详细的介绍一下,感兴趣的可以了解一下
    2024-09-09
  • 一文了解发现并解决Redis热key与大key问题

    一文了解发现并解决Redis热key与大key问题

    热key是服务端的常见问题,本文主要介绍Redis热key与大key问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Redis分布式锁python-redis-lock使用方法

    Redis分布式锁python-redis-lock使用方法

    这篇文章主要介绍了Redis分布式锁python-redis-lock使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 浅谈Redis的事件驱动模型

    浅谈Redis的事件驱动模型

    本文主要介绍了浅谈Redis的事件驱动模型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • redis哨兵模式分布式锁实现与实践方式(redisson)

    redis哨兵模式分布式锁实现与实践方式(redisson)

    这篇文章主要介绍了redis哨兵模式分布式锁实现与实践方式(redisson),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Centos7安装redis的超详细步骤教程

    Centos7安装redis的超详细步骤教程

    Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统,下面这篇文章主要介绍了Centos7安装redis的超详细步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Redis应用之签到的使用

    Redis应用之签到的使用

    在很多时候,我们遇到用户签到的场景,本文主要介绍了Redis应用之签到的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05

最新评论