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

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

目录

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

1、自定义注解

2、刪除逻辑

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。

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持易知道(ezd.cc)。 

推荐阅读

    redis密码设置|如何设置redis密码

    redis密码设置|如何设置redis密码,,如何设置redis密码初始化Redis密码: 在配置文件中有个参数: requirepass 这个就是配置redis访问密码的

    Redis集群批量操作

    Redis集群批量操作,节点,集群,Redis在3.0版正式引入了集群这个特性,扩展变得非常简单。然而当你开心的升级到3.0后,却发现有些很好用的功能

    redis sentinel模式命令集

    redis sentinel模式命令集,状态,频道, ping 订阅模式:ping 服务器回复:*2$4pong$0ping xxx 服务器回复:*2$4pong$3xxx其他模式ping 服

    C# 基于StackExchange.Redis.dll利用Redis实现分布式Session

    C# 基于StackExchange.Redis.dll利用Redis实现分布式Session,令牌,客户端,最近在研发一款O2O产品,考虑到分布式架构的需要,以前那一套.NET的

    REDIS|11 redis做分页

    REDIS|11 redis做分页,分页,每页,之前的数据都加载到了本地java的Map,分页如下@RequestMapping("/articles")String articles(Model mode

    softwaredistribution是什么文件夹

    softwaredistribution是什么文件夹,升级,存放,更新日志,文件,补丁下载,删除,softwaredistribution在Windows目录下,主要是用来存放WINDOWS UPDAT

    centos下redis无法连接

    centos下redis无法连接,防火墙,也会,主要是两方面的原因(1)redis.conf中bind的ip,默认是127.0.0.1,只能本地连接(体现为Could not connect to

    redis bitmap实现点赞的思路

    redis bitmap实现点赞的思路,照片,用户,bitmap简介:bitmap时一连串的二进制数字(0,1),每位所在的位置为偏移(offset),在bitmap上可以执行and、or

    redis的lua脚本多返回值

    redis的lua脚本多返回值,脚本,结果,如何在redis的lua中返回不同类型的多个返回值? lua脚本的函数支持多返回值,若redis调用lua脚本支持多返

    vcredist_x86vcredist_x64区别

    vcredist_x86vcredist_x64区别,应用程序,系统,vcredist_x86vcredist_x64区别Vcredist.exe 为 Visual C++ 应用程序安装最新的运行时组件;V