2021-11-21Redis分布式锁

分布式锁

同一个JVM内部,往往采用synchronized或者Lock的方式来解决多线程间的安全问题。但是在分布式架构下,在JVM之间,那么就需要一种更加高级的锁机制,来处理种跨JVM进程之间的线程安全问题。这就用到分布式锁

Redis分布式锁

setnx、expire

在这里插入图片描述
原理解析
在这里插入图片描述
加锁问题
在这里插入图片描述
set同时设置过期时间命令
在这里插入图片描述
Redis使用Lua命令
在这里插入图片描述
Jedis操作分布式锁
springBoot项目直接引入

<dependency>
   <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
/**
  * 尝试获取分布式锁
  * @param jedis Redis客户端
  * @param lockKey 锁
  * @param requestId 请求标识
  * @param expireTime 超期时间
  * @return 是否获取成功
  */
 public static  boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, long expireTime) {
     //String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
     String result = jedis.set(lockKey, requestId, SetParams.setParams().px(expireTime).nx());
     if (LOCK_SUCCESS.equals(result)) {
         return true;
     }
     return false;
 }
 /**
  * 释放分布式锁
  * @param jedis Redis客户端
  * @param lockKey 锁
  * @param requestId 请求标识
  * @return 是否释放成功
  */
 public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
     String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
     Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
     if (RELEASE_SUCCESS.equals(result)) {
         return true;
     }
     return false;
 }

锁过期问题

问题描述 STW问题引起
在这里插入图片描述
乐观锁解决方式
在这里插入图片描述
WatchDog自动延期
客户端1加锁的key默认生存时间30秒,如果超过了30秒,客户端1还想一直持有这把锁,咋办?只要客户端1一旦加锁成功,就会启动一个watch dog看门狗,它是一个后台线程,会没隔10秒检查一下,如果客户端1还持有锁key,那么就会不断延长锁key的生存时间
这种方式不会侵入业务代码,redisson就是采用这种方案

Redisson分布式锁

Redisson是基于Netty的Redis客户端。不但能操作原生的Redis数据结构,还为使用者提供了一系列具有分布式特性的常用工具类,实现了分布式锁。
Redisson分布式锁和JUC的Lock方法相似。RLock接口继承了Lock接口,锁的的结构是Hash,支持锁重入

Redisson加锁原理

在这里插入图片描述
加锁关键代码参考RedissonLock的tryLockInnerAsync方法
在这里插入图片描述

Redisson释放锁原理

在这里插入图片描述
释放锁关键代码参考RedissonLock的unlockInnerAsync方法
在这里插入图片描述
订阅Channel源码
在这里插入图片描述

watch dog自动延期

在这里插入图片描述

分段锁

分段锁原理
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值