共计 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 问一下细节
正文完