使用redis做分布式锁
1、使用setnx命令。先看下官方文档http://redis.cn/commands/setnx.html
2、使用getset命令。先获取,再set
实现案例:
* create 2018-12-03 16:22
* <p>
* desc
**/
@Component
@Slf4j
public class RedisLock { @Autowired
private StringRedisTemplate redisTemplate; public boolean lock(String key,String timeout){
//在StringRedisTemplate中,setIfAbsent = setnx
//timeout = 当前时间 + 超时时间
if(redisTemplate.opsForValue().setIfAbsent(key,timeout)){
//能成功set则证明拿到了锁
return true;
} //假如key已经存在 String currentValue = redisTemplate.opsForValue().get(key);//获取当前key的值 /**
* 此处为了防止死锁
*/ //如果锁过期
if(!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()){
//获取上一个锁的时间
String oldValue = redisTemplate.opsForValue().getAndSet(key,timeout); if(!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)){
return true;
}
}
return false;
} //解锁
public void unlock (String key,String value){
String currentValue = redisTemplate.opsForValue().get(key);
try{
if(!StringUtils.isEmpty(currentValue) && currentValue.equals(value)){
redisTemplate.opsForValue().getOperations().delete(key);
}
}catch (Exception e){
log.error("解锁异常,{}",e);
}
}
}
然后在需要加锁的逻辑上,引用这个锁方法即可
@Autowired
RedisLock redisLock ;
xxxx //业务逻辑 String time = System.currentTimeMillis()+10*1000;//超时10秒钟
if(!redisLock.lock(key,time) ){
//假如没锁上
//抛出异常
}
xxxxx //业务逻辑 //解锁
redisLock.unlock(key,time); 其他方案可参考:
http://www.cnblogs.com/seesun2012/p/9214653.html
使用redis做分布式锁的更多相关文章
- 程序员修神之路--redis做分布式锁可能不那么简单
菜菜哥,复联四上映了,要不要一起去看看? 又想骗我电影票,对不对? 呵呵,想去看了叫我呀 看来你工作不饱和呀 哪有,这两天我刚基于redis写了一个分布式锁,很简单 不管你基于什么做分布式锁,你觉得很 ...
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
- Redis++:Redis做分布式锁真的靠谱吗
Redis做分布式锁真的靠谱吗 Redis的分布式锁可以通过Lua进行实现,通过setnx和expire命令连用的方式 || 也可以使用高版本的方法同时设置失效时间,但是假如在以下情况下,就会造成无锁 ...
- redis咋么实现分布式锁,redis分布式锁的实现方式,redis做分布式锁 积极正义的少年
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- 基于 Redis 做分布式锁
基于 REDIS 的 SETNX().EXPIRE() 方法做分布式锁 setnx() setnx 的含义就是 SET if Not Exists,其主要有两个参数 setnx(key, value) ...
- Redis做分布式锁
在分布式系统中,在接口没有保证幂等性或者在某些场景下相同的服务需要有且仅有一个服务执行的情况下,需要使用分布式锁来保证系统的安全执行. 分布式锁的执行顺序,有服务A,分别部署了三个节点为A1.A2.A ...
- redis 做分布式锁
ok 我们从最基础的一步步来 加锁: 1.setNx没有expire,拿锁线程挂掉后,死锁 2.setNx然后exipre分两步做,setNx后redis宕机,或者线程挂掉,死锁 3.SETNX re ...
- 面试题详解:如何用Redis实现分布式锁?
说一道常见面试题: 使用Redis分布式锁的详细方案是什么? 一个很简单的答案就是去使用 Redission 客户端.Redission 中的锁方案就是 Redis 分布式锁的比较完美的详细方案. 那 ...
- 基于redis 实现分布式锁的方案
在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...
随机推荐
- 【CF542D】Superhero's Job 暴力
[CF542D]Superhero's Job 题意:$ f(x)=\sum\limits_{d|x,gcd(d,{x\over d})=1} d$ 给出 $A$ ,求方程 $f(x)=A$ 的正整数 ...
- 【CF480D】Parcels DP
[CF480D]Parcels 题意:有一个栈,有n个物品,每个物品可以选或不选.如果选了第i个物品,则获得$v_i$的收益,且第i个物品必须在$in_i$时刻入栈,$out_i$时刻出栈.每个物品还 ...
- nfs文件共享服务
文件共享服务端10.100.1.13: yum install -y rpcbind nfs-utils #rpcbind可以给nfs开多个端口 service rpcbind start serv ...
- 从零开始搭建Go语言开发环境
一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...
- Nest js 使用axios模块
文档 let r = await this.http.get(`https://api.github.com/users/januwA`).toPromise().then(v => v.dat ...
- 6 关于plsql中文显示乱码问题
打开plsql查看数据表时,会看到中文显示乱码问题 解决方案 输入下图所示语句并运行 在输入下图所示语句并运行,查看第一行和第九行是否对应 3)查看下环境变量的设置,查看是否有变量NLS_LANG,没 ...
- mac sed 使用踩坑实录
[转自别处] 比如我sed想做文件原地的替换,但是怎么写都出错,错误提示还莫名其妙,后来多方搜索才知道Mac上的sed如果参数有-i就必须加上备份指令,即-i后添加任意字符,那些字符就作为备份文件的后 ...
- 补充:ajax PHP html js 实现 三级联动(省 市 区)
html + js 在一个页面 php
- IO流实例
//字节流: import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;impor ...
- 下载频道--IT资源关东煮第二期[申明:来源于网络]
下载频道–IT资源关东煮第二期[申明:来源于网络] 地址:http://geek.csdn.net/news/detail/129509?ref=myread