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();
    }
}
相关推荐
賬號封禁中miu几秒前
图论之最小生成树
java·数据结构·算法·图论
月明长歌2 分钟前
Java数据结构:PriorityQueue堆与优先级队列:从概念到手写大根堆
java·数据结构·python·leetcode·
lalala_Zou4 分钟前
小米日常实习一面
java·后端·面试
算法与双吉汉堡10 分钟前
【短链接项目笔记】Day3 用户模块剩余部分
java·redis·后端
Chengbei1111 分钟前
fastjson 原生反序列化配合动态代理绕过限制
java·安全·网络安全·系统安全·安全架构
lhrimperial12 分钟前
MySQL底层原理
java·后端·mysql
qq_3771123713 分钟前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(1)-06
java·开发语言·jvm
学编程就要猛17 分钟前
算法:2.复写零
java·数据结构·算法
韩立学长20 分钟前
【开题答辩实录分享】以《植物园信息管理系统》为例进行选题答辩实录分享
java·数据库·spring
嘻哈baby20 分钟前
记一次线上OOM排查,JVM调优全过程
java