redis延时双删 原因,redis延时双删和异步更新比较

redis延时双删 原因,redis延时双删和异步更新比较,redis缓存一致性延时双删代码实现方式

这篇文章主要介绍了雷迪斯缓存一致性延时双删代码实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

目录

redis缓存一致性延时双删代码1、自定义注解2、刪除逻辑雷迪斯缓存延迟双删问题

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

不废话、如下

1、自定义注解

/**

* @作者曹越

*延时双删

**/

@保留(保留政策.运行时间)

@已记录

@Target(ElementType .方法)

public @interface ClearCache {

布尔开()默认为真实的

}

2、刪除逻辑

/**

* @作者曹越

*/

@组件

@Aspect

@Slf4j

公共类DoubleClearCacheAop {

@自动连线

私有用户服务用户服务;

//声明一个用于延时的定时线程池代替线程睡眠

ScheduledExecutorService task=new ScheduledThreadPoolExecutor(10,new BasicThreadFactory .

构建器()。命名模式(“清除高速缓存-调度-池-% d”).build());

@ Pointcut( @ annotation(com。浪潮。河南。UAC。模块。打开。util。清除缓存))

私有void clearCachePoint() {

}

@Around(clearCachePoint())

公共对象clearcache AOP(进程连接点收益)抛出可投掷的

方法方法=((方法签名)进程。获取签名().get方法();

清除缓存注释=方法。获取注释(清除缓存。类);

对象进行=空

//如果清除注解开启了

if (annotation.open()) {

//上下文获取信息

IPubUser user=msysecuritycontextholder。getuser();

if (Objects.nonNull(user)) {

//执行清除缓存的动作

用户服务. clearCache(用户);

//业务处理

收益=收益。proceed();

//延时两秒后再删

task.schedule(() - {

用户服务. clearCache(用户);

if (log.isInfoEnabled()) {

log.info(Thread.currentThread().getName():双重删除缓存完成);

}

}、2L、时间单位。秒);

}否则{

收益=收益。proceed();

}

}

返回继续进行;

}

}

redis缓存延迟双删问题

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

延迟双删的策略:

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

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

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

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

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

redis延时双删 原因,redis延时双删和异步更新比较