redis分布式锁的实现示例

58次阅读
没有评论

共计 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字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)