当前位置: 首页 > news >正文

Redis 与 MySQL 一致性 实现方案

正常情况下的流程是:请求来了,先检查 Redis 有没有数据,有返回;没有便查询 MySQL 然后 放入 Redis。

此时,如果 MySQL 的数据发生了变化,所以需要同步到 Redis 中。

解决方法:MySQL 中的数据更新的时候 ,在更新之前先删一次 Redis 中的数据,在更新之后再删一次 Redis 中的数据。

工具类

public class RedisUtil {private final static ScheduledExecutorService DELAY_EXECUTOR = new ScheduledThreadPoolExecutor(4);/*** 缓存延迟双删** @param factory 目标任务* @param keys    插入':' 拼接成需要删除的缓存key* @param <T>     any object* @return 目标任务返回结果*/public static <T> T doubleDeletion(Supplier<T> factory, Object... keys) {return RedisUtil.doubleDeletion(factory,() -> RedisUtil.getRedisTemplate().delete(RedisUtil.key(keys)));}/*** 缓存延迟双删** @param task 目标任务* @param keys 插入':' 拼接成需要删除的缓存key*/public static void doubleDeletion(Runnable task, Object... keys) {RedisUtil.doubleDeletion(task,() -> RedisUtil.getRedisTemplate().delete(RedisUtil.key(keys)));}/*** 缓存延迟双删** @param factory 目标任务* @param key     需要删除的缓存key* @param <T>     any object* @return 目标任务返回结果*/public static <T> T doubleDeletion(Supplier<T> factory, String key) {return RedisUtil.doubleDeletion(factory,() -> RedisUtil.getRedisTemplate().delete(key));}/*** 缓存延迟双删** @param task 目标任务* @param key  需要删除的缓存key*/public static void doubleDeletion(Runnable task, String key) {RedisUtil.doubleDeletion(task,() -> RedisUtil.getRedisTemplate().delete(key));}/*** 缓存延迟双删** @param factory         执行的目标任务* @param deleteCacheTask 清除缓存的任务* @param <T>             any object* @return 执行目标任务的返回结果*/public static <T> T doubleDeletion(Supplier<T> factory, Runnable deleteCacheTask) {deleteCacheTask.run();T data = factory.get();//延迟800毫秒秒再删一次DelayExecutor.DELAY_EXECUTOR.schedule(deleteCacheTask, 800, TimeUnit.MILLISECONDS);return data;}/*** 缓存延迟双删** @param task            目标任务* @param deleteCacheTask 清除缓存任务*/public static void doubleDeletion(Runnable task, Runnable deleteCacheTask) {RedisUtil.doubleDeletion(() -> {task.run();return null;},deleteCacheTask);}}

用法 1

RedisUtil.doubleDeletion(// 定义数据库更新操作() -> updateProcudt(product),// 定义 删除 redis 操作() -> RedisUtil.delete("product:" + id));

http://www.lryc.cn/news/210372.html

相关文章:

  • 运维 | 使用 Docker 安装 Jenkins | Jenkins
  • linux-磁盘应用
  • java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建
  • 软考高级之系统架构师之软件工程
  • SpringBoot集成与应用Neo4j
  • 做人,不一定要风风光光,但一定要堂堂正正。处事,不一定要尽善尽美,但一定要问心无愧。
  • 51单片机实验:数码管动态显示00-99
  • 【教3妹学编程-java实战5】结构体字段赋值的几种方式
  • 阿里蚂蚁淘宝等多次一面面试面经
  • UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解
  • c#使用ExifLib库提取图像的相机型号、光圈、快门、iso、曝光时间、焦距信息等EXIF信息
  • C++入门05—指针
  • Go学习第十六章——Gin文件上传与下载
  • 2.MySQL的调控按钮——启动选项和系统变量
  • 故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断
  • qt高精度定时器的使用停止线程应用
  • Spring Boot Actuator 介绍
  • 【MATLAB】安装Psychtoolbox
  • 【Python机器学习】零基础掌握GradientBoostingClassifier集成学习
  • RFNet模型数据集采集处理流程
  • sql-50练习题6-10
  • 【刷题宝典NO.1】
  • 如何在深度学习领域取得个人的成功
  • 数据结构【DS】B树
  • Chatgpt网页版根据关键词自动批量写原创文章软件【可多开自动登录切换gpt账号】
  • 研发效能认证学员作品:快速进行持续集成应用实践丨IDCF
  • 中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程
  • 2024年最新水果音乐制作软件FL Studio21需要多少钱呢?
  • 当生成式AI遇到业务流程管理,大语言模型正在变革BPM
  • Kotlin数据流概览