码迷,mamicode.com
首页 > 其他好文 > 详细

用redis实现分布式锁

时间:2018-12-04 17:07:48      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:reids   component   parse   factor   2.0   字符串   lombok   ops   span   

  用一个redis 实现分布式锁。

1.为什么要用reids 实现分布式锁(比较于syschronized 的优势) : 既然是分布式锁于syschronized 的优势 就在于分布式可用。java 提供的syschronized,lock(syschronized,lock内存语义不同.以后会写)等但是只适用于一个服务器。

 

www.redis.cn 中文redis网站。

 

本次实现redis分布式锁的几个  redis 命令。

SETNX :key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写

GETSET:自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。

 

代码:

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

@Component
@Slf4j
public class RedisLock {

@Autowired
private StringRedisTemplate redisTemplate;

/**
* @param key 订单id
* @param value 当前时间+超时时间
* @return
*/
public synchronized boolean lock(String key,String value){
//对应的是reids 中的SETNX命令 设置成功为true
if(redisTemplate.opsForValue().setIfAbsent(key, value)){
return true;
}
      
      //下面的意义是解决 当我们加锁后由于代码或者网络的原因中间抛出异常未能正常解锁
String currentValue = redisTemplate.opsForValue().get(key);

if(!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue)<System.currentTimeMillis()){

//获取上一个锁的时间
String oldValue = redisTemplate.opsForValue().getAndSet(key, value);
if(oldValue != null && oldValue.equals(currentValue)){
return true;
}
}

return false;
}

/**
* 解锁
* @param key
* @param value
*/
public void unlock(String key, String value){

try {
        
String currentValue = redisTemplate.opsForValue().get(key);

if(!StringUtils.isEmpty(currentValue) && currentValue.equals(value)){
redisTemplate.opsForValue().getOperations().delete(key);
}
}catch (Exception e){
log.error("【redis分布式锁解锁异常】,{}",e );
}


}
}

 

我用的是springBoot 2.0.5版本的

<!--redis依赖--> 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!--@Slf4j依赖--> 
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

 

 

 

GETSET

用redis实现分布式锁

标签:reids   component   parse   factor   2.0   字符串   lombok   ops   span   

原文地址:https://www.cnblogs.com/zzbjava/p/10064585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!