Mysql的数据如何与redis进行同步(双写一致性)

双写一致性:

当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。

  • 读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,返回数据。
  • 写操作:延迟双删。

删除缓存 ----> 修改数据库 --延时--> 删除缓存
① 为什么要删除两次缓存? 为了减少脏数据的出现。
② 为什么要延时双删? 一般数据库为主从模式,是读写分离的,需要延时一会等数据从主节点同步到从节点。
③ 延时双删有什么问题?

  1. 延时时间不太好确定。
  2. 延时的过程中可能会出现脏数据。

使用异步方案同步数据(最终一致性)

  • 使用MQ中间件,更新数据之后,通知缓存删除。
  • 利用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取binlog数据更新缓存。

使用读写锁同步(强一致性)

  • 采用Redisson提供的读写锁。
kotlin 复制代码
// 共享锁:读锁readLock,加锁之后,其他线程可以共享读操作。
//读操作
public Object getById(Long id){
    RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("TEST_LOCK");
    // 读锁
    RLock readLock = readWriteLock.readLock();
    try{
        readLock.lock();
        System.out.println("readLock...");
        Object result = (Object) redisTemplate.opsForValue().get("goods:" + id);
        if (result != null){
            return result;
        }
        //  数据库查询
        result = goodsMapper.selectGoodsByGoodsId(id);
        // 写入缓存
        redisTemplate.opsForValue().set("goods:" + id, result);
        return result;
    }finally {
        readLock.unlock();
    }
}
csharp 复制代码
// 排他锁:独占锁writeLock,加锁之后,阻塞其他线程读写操作。
// 写操作
public void updateById(Goods goods){
    RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("TEST_LOCK");
    // 写锁
    RLock writeLock = readWriteLock.writeLock();
    try{
        writeLock.lock();
        System.out.println("writeLock...");
        // 更新数据库
        goodsMapper.updateById(goods);
        try {
            Thread.sleep(5000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        // 删除缓存
        redisTemplate.delete("goods:" + goods.getGoodsId());
    }finally {
        writeLock.unlock();
    }
}
相关推荐
M-Robots echo2 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~2 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
mldong3 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
mqiqe4 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一514 小时前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding4 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g5 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
AC赳赳老秦5 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
小强库计算机毕业设计7 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
李冰然7 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java