redis分布式锁处理并发问题
来源:互联网 发布:网络语言暴力后果 编辑:程序博客网 时间:2024/06/06 20:40
redis锁处理并发问题
redis锁处理高并发问题十分常见,使用的时候常见有几种错误,和对应的解决办法,在此进行自己的总结和整理。
- set方式
- setnx方式
- setnx+getset方式
set方式
作为redis小白,一开始能想到的使用redis加锁的方式就是set。
加锁:redis中set一个值,set(lock,1);
并发处理:其他线程必须拿到这个值,才可以往下进行,否则等待。
while(jedis.exists(lock)){ Thread.sleep(500); } set(lock,1); 执行业务代码; jedis.del(lock);
释放锁:执行完业务代码之后,释放redis锁,jedis.del(lock)
防止死锁:set(lock,1) —>3秒后未释放,则自动释放setex(lock, 3, 1)
问题:高并发情况下,进程同时获取锁状态为null,同时设置,锁之间相互覆盖,但是俩进程仍在并发执行业务代码。
setnx方式
后来发现有setnx的原子操作命令,锁存在不能设置值,返回0;锁不存在,则设置锁,返回1;
加锁:jedis.setnx(lock, 1)
并发处理:
while(jedis.setnx(lock,1)==0){ Thread.sleep(300);}执行业务代码;jedis.del(lock);
释放锁:执行完业务代码之后,释放redis锁,jedis.del(lock)
问题:当进程执行出现问题,锁未释放,则其他进程永远处于阻塞状态,出现死锁。
防止死锁:加锁时带上时间戳,setnx(lock, 时间戳+超时时间)
while(jedis.setnx(lock,now+超时时间)==0){ if(jedis.get(lock)<now){ jedis.del(lock); jedis.setnx(lock,now+超时时间); break; }else{ Thread.sleep(300); } } 执行业务代码; jedis.del(lock);
问题:当俩进程同时读到发现锁超时,都去释放锁,相互覆盖,则俩进程同时获得锁,仍并发执行业务代码。
setnx+getset方式
为解决上面的问题,可以使用getset命令,getset设置键值,并返回原来的键值。
加锁:setnx(lock, 时间戳+超时时间)
解决并发:
while(jedis.setnx(lock, now+超时时间)==0){ if(now>jedis.get(lock) && now>jedis.getset(lock, now+超时时间)){ break; }else{ Thread.sleep(300); }}执行业务代码;jedis.del(lock);
释放锁:jedis.del(lock);
2 0
- redis分布式锁处理并发问题
- 使用redis 实现分布式锁,处理并发问题
- redis并发问题 && 分布式锁
- Redis解决分布式并发编程问题
- redis分布式锁实现控制并发
- 用redis处理并发问题的代码
- redis并发处理慢
- redis 秒杀多并发处理
- 如何利用Redis分布式锁实现控制并发
- redis使用乐观锁时处理竞争问题,高并发时失败率高如何解决
- 关于redis 锁(分布式锁)的问题
- 高并发处理-集群、分布式
- Redis 并发, 锁, 竞争锁问题.
- Redis 并发, 锁, 竞争锁问题
- Redis 并发 锁 竞争锁问题
- Redis并发问题
- redis并发问题
- redis并发问题
- String类的20种常见方法
- 回文质数
- 设计模式——享元模式
- 初试python网络通信
- 11
- redis分布式锁处理并发问题
- new delete 基础应用
- Sublime text 3使用
- 搭建了一个自学编程的论坛,大家多来捧场
- Spring技术核心内幕 读书笔记--IOC容器的实现小结
- java基础笔记
- Oracle误删表空间数据文件报错
- 22
- Android消息机制-Handler