使用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)的更多相关文章

  1. 基于redis集群实现的分布式锁,可用于秒杀,定时器。

    在分布式系统中,经常会出现需要竞争同一资源的情况,使用redis可以实现分布式锁. 前提:redis集群已经整合项目,并且可以直接注入JedisCluster使用: @Autowired privat ...

  2. 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)

    转载请标明出处. 在分布式系统中,常常会出现须要竞争同一资源的情况,本代码基于redis3.0.1+jedis2.7.1实现了分布式锁. redis集群的搭建,请见我的另外一篇文章:<>& ...

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

    分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的. 要点 Red ...

  4. 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁

    spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...

  5. python使用redis实现协同控制的分布式锁

    python使用redis实现协同控制的分布式锁 上午的时候,有个腾讯的朋友问我,关于用zookeeper分布式锁的设计,他的需求其实很简单,就是节点之间的协同合作. 我以前用redis写过一个网络锁 ...

  6. Redis的“假事务”与分布式锁

    关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...

  7. 使用数据库、Redis、ZK分别实现分布式锁!

    分布式锁三种实现方式: 基于数据库实现分布式锁: 基于缓存(Redis等)实现分布式锁: 基于Zookeeper实现分布式锁: 基于数据库实现分布式锁 悲观锁 利用select - where - f ...

  8. 终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...

  9. redis 加锁与释放锁(分布式锁)

    使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置

随机推荐

  1. 自然数幂和(递推式k^2方法)

    先用这个方法顶一下!

  2. C#4.0中的协变和逆变

    原文地址 谈谈.Net中的协变和逆变 关于协变和逆变要从面向对象继承说起.继承关系是指子类和父类之间的关系:子类从父类继承所以子类的实例也就是父类的实例.比如说Animal是父类,Dog是从Anima ...

  3. Flume下载安装

    下载 可以apache官网下载flume的安装包 下载时注意,flume具有两个版本,0.9.x和1.x,两个版本并不兼容,我们用最新的1.x版本,也叫flume-ng版本. 安装 解压到指定目录即可 ...

  4. Angular项目里Js代码里如何获取Ts文件中的属性数据

    基于之前实现的Angular+ngx-ueditor富文本编辑器做一个简单补充记录,我们在使用Angular开发过程中,难免会使用到调用外部插件Js的应用,但是有的时候又需要在Js文件中调用Ts文件里 ...

  5. PostgreSQL unlogged表

    PostgreSQL有一种介于正常表和临时表之间的类型表,称之为unlogged表,在该表新建的索引也属于unlogged,该表在写入数据时候并不将数据写入到持久的write-ahead log文件中 ...

  6. JavaScript刷新事件

    1, Location reload() 方法 2,

  7. p24 map 之 golang基础

    Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. 参考文档 https://www.liwenzhou.com/posts/Go/08_map/ package main im ...

  8. 批量操作checkbox

    通过post可获取选中的checkbox的value值,然后可以action到某一页面通过$_POST[]处理得到的checkbox的值,然后进行批量化增删改查等操作. // 关键性语句: <i ...

  9. Fiddler--手机端抓包

    1.打开fiddler,点击Tools--options 2.勾选 3.确保手机与电脑连接同一个WIFI 4.打开手机无线网络,选择连接的WiFi,然后在代理选择手动,输入ip和端口号,查看本机ip

  10. AWS In Action

    Core Services of AWS Elastic Cloud Compute(EC2) Simple Storage Service(S3) Relational Database Servi ...