缓存与数据库双写不一致的问题及解决方式

该博客讨论了在并发环境下,更新数据库时可能导致的缓存双写不一致问题。通过引入Redisson的读写锁机制,确保了在读取和更新库存操作中的线程安全。当读锁被持有时,多个线程可以同时读取库存,而写锁则确保了在更新库存时的互斥访问,防止数据冲突。这种方法提高了系统的并发性能并保证了数据一致性。
摘要由CSDN通过智能技术生成

一般而言,我们在更新数据库时会把redis的值删除掉,然后第一次查询时从数据库查询并且更新到redis中。但从数据库查询然后更新到redis中这并不是原子操作,可能出现并发问题。

问题描述:当线程1正常更新数据库并删除redis的数据 ,在线程2第一次查询时,线程3更新数据并删除redis的数据,这时线程2才执行到更新redis,就会出现数据库与缓存双写不一致的问题。

使用redisson读写锁来解决

@RequestMapping("/getStock")
    public String getStock(){
        String lockKey = "product_01001";
        //获取一个读锁
        RReadWriteLock readWriteLock = redisson.getReadWriteLock(lockKey);
        RLock rLock = readWriteLock.readLock();

        //加锁
        rLock.lock();
        String stock = stringRedisTemplate.opsForValue().get("stock");
        if (StringUtils.isEmpty(stock)){
            System.out.println("查询对应商品的id的库存");
            stringRedisTemplate.opsForValue().set("stock","数据库查询出来的值");
        }else{
            return "stock";
        }
        //解锁
        rLock.unlock();

        return "stock";
    }

    @RequestMapping("/updateStock")
    public String updateStock(){
        String lockKey = "product_01001";
        //获取一个写锁
        RReadWriteLock readWriteLock = redisson.getReadWriteLock(lockKey);
        RLock rLock = readWriteLock.writeLock();

        //加锁
        rLock.lock();

        System.out.println("更新数据库对应商品的id的库存");
        stringRedisTemplate.delete("stock");

        //解锁
        rLock.unlock();
        return "end";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值