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

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.kler.cn/a/107597.html

相关文章:

  • 嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
  • 5G时代的关键元件:射频微波MLCCs市场前景广阔
  • 将大型语言模型(如GPT-4)微调用于文本续写任务
  • [项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]
  • 期权懂|期权新手入门教学:期权合约有哪些要素?
  • Flink API 的层次结构
  • RSA:基于小加密指数的攻击方式与思维技巧
  • SpringCore完整学习教程5,入门级别
  • 单元测试Testng
  • vue中如何获取当时时间时分秒
  • “第五十三天”
  • 数据库批处理
  • C++学习笔记之四(标准库、标准模板库、vector类)
  • slice()和splice()用法
  • 【笔录】TVP技术沙龙:寻宝AI时代
  • dd命令用法学习,是一个功能强大的工具
  • 走进人工智能的大门:打造职业梦想的契机
  • Vue+ElementUI项目打包部署到Ubuntu服务器中
  • C# 图解教程 第5版 —— 第11章 结构
  • Vue3问题:如何实现密码加密登录?前后端!
  • 查询和下载国自然科学基金
  • 算法——贪心算法
  • 适用于嵌入式arm的ffmpeg编解码
  • RedissonCach的源码流程
  • 视频转换器WinX HD Video Converter mac中文特点介绍
  • 在el-dialog中使用tinymce 点击工具栏下拉框被遮挡