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锁的实现的主要内容,如果未能解决你的问题,请参考以下文章

redis分布式锁的正确实现

PHP中redis加锁和解锁的简单实现

Redis中是如何实现分布式锁的?

Redis分布式锁的实现

Redis分布式锁的正确实现方式

Redis分布式锁的正确实现方式