在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

redis分布式锁的实现示例

117次阅读
没有评论

共计 5163 个字符,预计需要花费 13 分钟才能阅读完成。

自动写代码机器人,免费开通

丸趣 TV 小编给大家分享一下 redis 分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Redisson

redisson 和下列一下自行封装两种方式的区别(场景):

redisson 未获取到锁的会进入等待,直到获取到锁。

另外两种方式如果未获取到锁,会放弃,不会执行业务代码。

dependency 
  groupId org.redisson /groupId 
  artifactId redisson-spring-boot-starter /artifactId 
  version 3.13.6 /version /dependency
@Autowiredprivate Redisson redisson;@GetMapping(/redissonLock)public String redissonLock() {
 log.info( 进入了方法 
 RLock lock = redisson.getLock( redissonLock 
 try { lock.lock(30, TimeUnit.SECONDS);
 Thread.sleep(10000);
 System.out.println( 我是你大哥 
 } catch (InterruptedException e) { e.printStackTrace();
 } finally {
 //  如果不释放,不会唤起其他线程,则其他线程会超时过期自动唤醒,不会执行业务代码
 lock.unlock();
 }
 return  运行结束 }

RedisTemplate 封装 redis 锁(1)

dependency 
  groupId org.springframework.boot /groupId 
  artifactId spring-boot-starter-data-redis /artifactId /dependency
package com.util;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.RedisScript;import org.springframework.data.redis.core.types.Expiration;import org.springframework.stereotype.Component;import java.util.Arrays;@Componentpublic class RedisLock {
 private static RedisTemplate redisTemplate;
 private static String script =  if redis.call(\ get\ ,KEYS[1]) == ARGV[1] then\n  +
  \treturn redis.call(\ del\ ,KEYS[1])\n  +
  else\n  +
   \treturn 0\t\n  +
  end  
 public RedisLock(RedisTemplate redisTemplate) {
 RedisLock.redisTemplate = redisTemplate;
 }
 public static Boolean getLock(String key, String value, Long expireTime) { RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
 Expiration expiration = Expiration.seconds(expireTime);
 RedisCallback Boolean  booleanRedisCallback = new RedisCallback Boolean () {
 @Override
 public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
 }
 };
 return (Boolean) redisTemplate.execute(booleanRedisCallback);
 }
 public static Boolean unLock(String key, String value) { RedisScript Boolean  redisScript = RedisScript.of(script, Boolean.class);
 return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
 }}
@GetMapping(/redisLock)public String redisLock() {
 log.info( 进入了方法 
 String key =  redisLock 
 String uuid = UUID.randomUUID().toString();
 try { if (RedisLock.getLock(key, uuid, 30L)) {
 log.info( 进入了锁 
 Thread.sleep(10000);
 }
 } catch (InterruptedException e) { e.printStackTrace();
 } finally { RedisLock.unLock(key, uuid);
 }
 log.info( 方法执行完成 
 return  程序结束 }

RedisTemplate 封装 redis 锁(2)

package com.util;import lombok.extern.slf4j.Slf4j;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.RedisScript;import org.springframework.data.redis.core.types.Expiration;import java.util.Arrays;import java.util.UUID;@Slf4jpublic class HighRedisLock implements AutoCloseable{
 private RedisTemplate redisTemplate;
 private String key;
 private String value;
 private Long expireTime;
 private static String script =  if redis.call(\ get\ ,KEYS[1]) == ARGV[1] then\n  +
  \treturn redis.call(\ del\ ,KEYS[1])\n  +
  else\n  +
   \treturn 0\t\n  +
  end  
 public HighRedisLock(RedisTemplate redisTemplate, String key, Long expireTime) {
 this.redisTemplate = redisTemplate;
 this.key = key;
 this.value = UUID.randomUUID().toString();
 this.expireTime = expireTime;
 }
 public Boolean getLock() { RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
 Expiration expiration = Expiration.seconds(expireTime);
 RedisCallback Boolean  booleanRedisCallback = new RedisCallback Boolean () {
 @Override
 public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
 }
 };
 return (Boolean) redisTemplate.execute(booleanRedisCallback);
 }
 public Boolean unLock() { RedisScript Boolean  redisScript = RedisScript.of(script, Boolean.class);
 return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
 }
 @Override
 public void close() throws Exception { unLock();
 }}
@Autowiredprivate RedisTemplate redisTemplate;@GetMapping(/highRedisLock)public String highRedisLock() {
 log.info( 进入了方法 
 try (HighRedisLock redisLock = new HighRedisLock(redisTemplate,  highRedisLock , 30L)) { if (redisLock.getLock()) {
 log.info( 进入了锁 
 Thread.sleep(10000);
 }
 } catch (InterruptedException e) { e.printStackTrace();
 } catch (Exception e) { e.printStackTrace();
 }
 log.info( 方法执行完成 
 return  程序结束 }

以上是“redis 分布式锁的实现示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计5163字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 四虎影院在线观看网站 | 国产精品热久久毛片 | 日韩一区二区三区在线播放 | 伊人久久大香线蕉无码 | 欧美国产成人一区二区三区 | 久久这里只有免费精品6www | 中文亚洲 | 亚洲精品无码成人网站 | 在线久综合色手机在线播放 | 国产乱人伦av麻豆网 | 高清成人爽a毛片免费网站 高清大学生毛片一级 | 全黄a免费一级毛片人人爱 全黄h全肉边做边吃奶视频 | 加勒比中文无码久久综合色 | 久久亚洲av无码精品色午夜 | 国产精品视频一区二区三区四 | 精品在线观看国产 | 久久亚洲色一区二区三区 | 免费看美女的网站 | 老司机在线精品视频91免费观看 | 国产精品免费看久久久无码 | 久久99久久精品免费思思6 | 亚洲人午夜射精精品日韩 | 久久夜夜| 亚洲欧美日韩中文在线制服 | 高清视频在线观看一区二区三区 | 无码夜色一区二区三区 | 夜色传媒| 午夜片在线观看 | 四虎精品影视 | 欧美日韩国产高清精卡 | 亚洲精品无码专区久久久 | 婷婷综合另类小说色区 | 高中生自慰www网站 髙清国产性猛交xxxand | 久久久久亚洲精品无码网址 | 黑人上司粗大拔不出来电影 | 99热这里有精品 | 欧美在线激情 | 久久久久99精品成人片直播 | 看毛片网站 | 欧美性xxxxx极品娇小 | 澳门在线高清一级毛片 |