redis锁的实现
Posted LMD酱油飘过
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis锁的实现相关的知识,希望对你有一定的参考价值。
redisjar引用
<!-- redis工具类 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 去掉下面这个,是因为在高并发调用redis时,如果你用的jedis的方式连接,大量连接redis就会出现连接不上redis的错误 --> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
springboot配置文件,我这个是yml的配置文件,(下面是集群的redis,如果是单个的就加host和port,以及密码这些)
spring: redis: # redis密码,如果是集群,所有密码必须一致 password: jedis: pool: # 连接池最大连接数(使用负值表示没有限制) max-active: 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 # 连接池中的最大空闲连接 max-idle: 8 # 连接池中的最小空闲连接 min-idle: 0 # 链接超时时间(毫秒) timeout: 30000 # redis集群配置 cluster: # redis集群所有的服务器 nodes: 10.5.9.140:7000,10.5.9.140:7001,10.5.9.140:7002 # 跨集群执行命令时要遵循的最大重定向数量 max-redirects: 3
redis初始化连接工具
// private RedisTemplate redisTemplate; // 初始化redis连接工具 @Autowired(required = false) public void setRedisTemplate(RedisTemplate redisTemplate) { RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); this.redisTemplate = redisTemplate; }
锁的代码
/**
* 判断是否已经锁上 true 表示已经上锁 flase表示没有上锁
*/
public boolean isLock(String key) {
try {
Object object = redisTemplate.opsForValue().get(key);
if (object != null) {
return true;
} else {
return false;
}
} catch (Throwable e) {
log.error("[redis分布式锁] 获取锁异常, {}", key);
}
return false;
}
/**
* 加锁
* @param key
* @param value 随便存储一个值,也可以不用存储
* @return
*/
public boolean lock(String key, String value) {
//SETNX命令, 可以设置返回true, 不可以返回false
try {
if (StringUtils.isBlank(value)) {
value = "1";
}
// 这个方法表示,如果这个key值存在就不更新值
if (redisTemplate.opsForValue().setIfAbsent(key, value)) {
return true;
}
} catch (Throwable e) {
log.error("[redis分布式锁] 加锁异常, {}", key);
}
return false;
}
/**
* 解锁
*/
public boolean unLock(String key) {
try {
Object object = redisTemplate.opsForValue().get(key);
if (object != null) {
return redisTemplate.opsForValue().getOperations().delete(key);
}
} catch (Throwable e) {
log.error("[redis分布式锁] 解锁异常, {}", key);
}
return false;
}
个人心得记录,如果其他观点,欢迎一起指点,讨论学习
以上是关于redis锁的实现的主要内容,如果未能解决你的问题,请参考以下文章