分布式锁+分布式下的缓存问题 使用redis(redisson) 实现分布式锁

这篇博客探讨了在微服务模式下如何通过逐步优化实现高可靠的分布式锁,主要利用Redis的set命令的NX参数及过期时间,并最终通过Redisson框架简化分布式锁的实现。文中详细介绍了各个优化阶段,包括原子操作、权限验证和Lua脚本的使用。
摘要由CSDN通过智能技术生成

分布式锁+分布式下的缓存问题

  • 当微服务模式时,多个相同服务之间对于数据库需要保持数据一致性.此时需要从本地锁 演变为 分布式锁.
  • 本博文通过进阶的形式 不断提出问题以及解决思路,一步一步完善代码,实现具有高可靠性的分布式锁功能.

在这里插入图片描述

使用redis的set命令带NX(not exist)参数实现分布式锁

NX:只有当不存在时,才可以set;成功set会返回OK,不成功返回null
在这里插入图片描述

//分布式锁
public Map<String, List<Catelog2Vo>> getCatalogJsonFromDBWithRedisLock() {
   

    //1、占分布式锁。去redis占坑
    Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent("lock", "lock");
    if(aBoolean){
   
        //加锁成功 执行业务
        Map<String, List<Catelog2Vo>> dataFromDB = this.getDataFromDB();
        //删除锁
        stringRedisTemplate.delete("lock");
        return dataFromDB;
    }else {
   
        //加锁失败   重试 自旋
        return getCatalogJsonFromDBWithRedisLock();
    }
}

阶段二 独立加上分布式锁的过期时间

在这里插入图片描述

//分布式锁
public Map<String, List<Catelog2Vo>> getCatalogJsonFromDBWithRedisLock() {
   

    //1、占分布式锁。去redis占坑
    Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent("lock", "lock");
    if(aBoolean){
   
        //加锁成功 执行业务
        //2、设置过期时间
        stringRedisTemplate.expire("lock",30, TimeUnit.SECONDS);
        Map<String, List<Catelog2Vo>> dataFromDB = this.getDataFromDB();
        //删除锁
        stringRedisTemplate.delete("lock");
        return dataFromDB;
    }e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值