当前位置:网站首页>redis分布式锁代码示例
redis分布式锁代码示例
2022-08-09 22:43:00 【shy_snow】
import java.util.Collections;
import redis.clients.jedis.Jedis;
public class RedisTool
{
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
/** * 尝试获取分布式锁 * * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @param expireTime 超期时间 * @return 是否获取成功 */
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime)
{
/* * set(String key, String value, String nxxx, String expx, int time) * 第一个为key,我们使用key来当锁,因为key是唯一的。 * 第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?原因就是我们在上面讲到可靠性时,分布式锁要满足第四个条件解铃还须系铃人, * 通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。requestId可以使用UUID.randomUUID().toString()方法生成。 * 第三个为nxxx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作; * 第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定。 第五个为time,与第四个参数相呼应,代表key的过期时间,单位为ms。 * 总的来说,执行set()方法就只会导致两种结果: 1. 当前没有锁(key不存在),那么就进行加锁操作,并对锁设置个有效期,同时value表示加锁的客户端。 2. 已有锁存在,不做任何操作。 */
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result))
{
return true;
}
return false;
}
private static final Long RELEASE_SUCCESS = 1L;
/** * 释放分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @return 是否释放成功 */
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
// 使用lua脚本保证原子性
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
public static void main(String[] args) {
String host = "192.168.129.124";
int port = 6379;
Jedis jedis = new Jedis(host,port);
String lockKey = "lockKey";
boolean ret = tryGetDistributedLock(jedis, lockKey, "requestId", 5000);
System.out.println(ret+", "+jedis.get(lockKey));
ret = releaseDistributedLock(jedis, lockKey, "requestId2");
ret = tryGetDistributedLock(jedis, lockKey, "requestId2", 5000);
System.out.println(ret+", "+jedis.get(lockKey));
ret = releaseDistributedLock(jedis, lockKey, "requestId");
System.out.println(ret+", "+jedis.get(lockKey));
ret = tryGetDistributedLock(jedis, lockKey, "requestId2", 5000);
System.out.println(ret+", "+jedis.get(lockKey));
}
}
https://www.w3cschool.cn/redis/redis-yj3f2p0c.html
边栏推荐
- Seq2Seq论文阅读笔记
- HStreamDB v0.9 发布:分区模型扩展,支持与外部系统集成
- 金仓数据库 KingbaseGIS 使用手册(6.3. 几何对象创建函数)
- Force Buckle: 474. Ones and zeros
- 基于 RocksDB 实现高可靠、低时延的 MQTT 数据持久化
- 新增一地公布2022下半年软考报考时间
- 巴比特 | 元宇宙每日必读:国内首个数字人产业专项支持政策发布,2025年北京数字人产业规模将破500亿元...
- Mysql/stonedb - slow SQL - 2022-08-09 Q16 analysis
- 打包报错 AAPT: error: failed to read PNG signature: file does not start with PNG signature.
- ES6 从入门到精通 # 15:生成器 Generator 的用法
猜你喜欢

Live Preview | ICML 2022 11 first-author scholars share online neural network, graph learning and other cutting-edge research

AUTOCAD——形位公差如何标注、CAD打断于点的操作

KingbaseGIS Jin Cang database using manual (6.3. Geometric object creation function)

技术盛宴!华云数据携六大议题亮相OpenInfra Days China

6款跨境电商常用工具汇总

AirFlow介绍

How to match garbled characters regularly?

如何知道电脑开机记录?

干货!迈向鲁棒的测试时间适应

FreeRTOS任务基础
随机推荐
带着昇腾去旅行:一日看尽金陵城里的AI胜景
LiveData : Transformations.map and Transformations.switchMap usage
tiup cluster start
【JZOF】82二叉树中和为某一值的路径(一)
用哈希简单封装unordered_map和unordered_set
外包的水有多深?腾讯15k的外包测试岗能去吗?
【诗歌】最高级的惩罚就是沉默
你的手机曾经被监控过吗?
直播app开发搭建,flutter 实现自适应、自动换行、相对布局
2022牛客暑期多校训练营6(ABGIJM)
探索TiDB Lightning源码来解决发现的bug
【JZOF】32从上往下打印二叉树
中国SaaS企业排名,龙头企业Top10梳理
金仓数据库 KingbaseGIS 使用手册(6.3. 几何对象创建函数)
如何知道电脑开机记录?
多商户商城系统功能拆解24讲-平台端分销会员
函数习题(下)
AirFlow介绍
打包报错 AAPT: error: failed to read PNG signature: file does not start with PNG signature.
ES6 从入门到精通 # 14:迭代器 Iterator 的用法