这篇文章主要介绍了雷迪斯缓存一致性延时双删代码实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录
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。
休眠时间不能太大,否则会影响更新的速度。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。