redis 加锁与释放锁(分布式锁1)
使用Redis的 SETNX 命令可以实现分布式锁
SETNX key value
返回值
返回整数,具体为
- 1,当 key 的值被设置
- 0,当 key 的值没被设置
分布式锁使用
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; /**
* @Author: feng
* @Date: 2019/5/25 21:54
* @Description:
*/
public class RedisManager { private static JedisPool jedisPool; static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(18);
jedisPoolConfig.setMaxIdle(5);
jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379,5000);
} public static Jedis getJedis() throws Exception {
if (null != jedisPool){
return jedisPool.getResource();
}
throw new Exception("Jedispool was not init");
}
}
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction; import java.util.List; /**
* @Author: feng
* @Date: 2019/5/25 22:04
* @Description:
*/
public class RedisLock { public String getLock(String key, int timeout) {
Jedis jedis = null;
try {
jedis = RedisManager.getJedis();
// String value = UUID.randomUUID().toString();
//以当前线程id作为value
String value = String.valueOf(Thread.currentThread().getId());
long end = System.currentTimeMillis() + timeout;
while (System.currentTimeMillis() < end) {
if (jedis.setnx(key, value) == 1) {
jedis.expire(key, timeout);
return value;
}
if (jedis.ttl(key) == -1) {
jedis.expire(key, timeout);
}
Thread.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
return null;
} public boolean releaseLock(String key, String value) {
Jedis jedis = null;
try {
jedis = RedisManager.getJedis();
while (true) {
jedis.watch(key);
System.out.println(jedis.get(key));
if (value.equals(jedis.get(key))) {
Transaction transaction = jedis.multi();
transaction.del(key);
List<Object> list = transaction.exec();
if (list == null) {
continue;
}
}
jedis.unwatch();
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
return false;
} public static void main(String[] args) {
RedisLock redisLock = new RedisLock();
String thredId = redisLock.getLock("test", 1000);
System.out.println("返回值value:" + thredId);
boolean b = redisLock.releaseLock("test", String.valueOf(Thread.currentThread().getId()));
System.out.println(b);
} }
redis 加锁与释放锁(分布式锁1)的更多相关文章
- 基于redis集群实现的分布式锁,可用于秒杀,定时器。
在分布式系统中,经常会出现需要竞争同一资源的情况,使用redis可以实现分布式锁. 前提:redis集群已经整合项目,并且可以直接注入JedisCluster使用: @Autowired privat ...
- 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)
转载请标明出处. 在分布式系统中,常常会出现须要竞争同一资源的情况,本代码基于redis3.0.1+jedis2.7.1实现了分布式锁. redis集群的搭建,请见我的另外一篇文章:<>& ...
- Redis中是如何实现分布式锁的?
分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的. 要点 Red ...
- 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁
spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...
- python使用redis实现协同控制的分布式锁
python使用redis实现协同控制的分布式锁 上午的时候,有个腾讯的朋友问我,关于用zookeeper分布式锁的设计,他的需求其实很简单,就是节点之间的协同合作. 我以前用redis写过一个网络锁 ...
- Redis的“假事务”与分布式锁
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...
- 使用数据库、Redis、ZK分别实现分布式锁!
分布式锁三种实现方式: 基于数据库实现分布式锁: 基于缓存(Redis等)实现分布式锁: 基于Zookeeper实现分布式锁: 基于数据库实现分布式锁 悲观锁 利用select - where - f ...
- 终极锁实战:单JVM锁+分布式锁
目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...
- redis 加锁与释放锁(分布式锁)
使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置
随机推荐
- shaderToy学习篇
觉得shadertoy上的一些网友的作品写得很好,加上自己对glsl一些内置函数,内置变量不是很熟悉,于是决定开始学习一下上面一些大佬的代码. 今天的案例是这个: 附上shaderToy的地址:htt ...
- 非UI线程更新UI界面的各种方法小结
转载:https://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645541.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控 ...
- HTML中Data的数据类型
"data"类型的Url格式,是在RFC2397中提出的,目的对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入. 例如对于img这个Tag,哪怕这个图片非常非常的小 ...
- Markedown换行
1.换行 1⃣️行尾先加两个空格符后再按回车键,显示内容就会换行 2⃣️行尾连按两次回车键,显示内容就会换行 3⃣️举例: 第一行内容<br/>第二行内容 第一行内容<br>第 ...
- 2019中山纪念中学夏令营-Day12[JZOJ]
Begin (题目的排序方式:题号) 每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs 推荐知识:namespace的用法(本赛我的代码中将用到) 2019.08.12[NOIP普及组]模拟 ...
- python进程之间的通信——Queue
我们知道进程之间的数据是互不影响的,但有时我们需要在进程之间通信,那怎么办呢? 认识Queue 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息 ...
- Ruby学习中(首探数组, 注释, 运算符, 三元表达式, 字符串)
一. 数组 1.定义一个数组 games = ["英雄联盟", "绝地求生", "钢铁雄心"] puts games 2.数组的循环 gam ...
- 开发MT4连接失败最easy忽视的一个错误
m_factory.WinsockStartup();
- 搭建springCloud网关zuul
一.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- JS基础_其他进制的数字(了解)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...