redis加锁和解锁
本文章用于自己学习的操作,如果文章中有错误,麻烦各位留言指正,自己测试单流程是没有问题的
加锁
//调用加锁
boolean lock = redisService.getLock(resourceInfoId.toString(), String.valueOf(Thread.currentThread().getId()));if (lock == false) {return new FebsResponse().fail().message("当前资源正在审核中,请勿重复提交!");}//调用解锁 ps:无论程序运行是否成功,都要释放锁,否则可能导致陷入死锁,如果是try方式,将解锁调用放在finally里面
try{}finally{redisService.releaseLock(resourceInfoId.toString(), String.valueOf(Thread.currentThread().getId()));
}//静态参数
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";
private static final Long RELEASE_SUCCESS = 1L;//加锁方法
@Override
public boolean getLock(String key,String requestId) {String result = jedisPool.getResource().set(key, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10);if (LOCK_SUCCESS.equals(result)) {return true;}return false;
} //解锁方法
@Override
public boolean releaseLock(String key,String requestId) {String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";Object result = jedisPool.getResource().eval(script, Collections.singletonList(key), Collections.singletonList(requestId));if (RELEASE_SUCCESS.equals(result)) {return true;}return false;}
ps:上述代码不够完善,上线后发现,程序报错异常信息:Could not get a resource from the pool,然后修改一下,示例一下加锁方法,解锁方法同样要释放连接池public boolean getLock(String key,String requestId) {Jedis jedis = null;try{jedis = jedisPool.getResource();String result = jedis.set(key, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, 10);if (LOCK_SUCCESS.equals(result)) {return true;}}finally {if(null != jedis){jedis.close();}}return false;}
redis加锁和解锁相关推荐
- redis加锁、解锁
在Java中,关于锁我想大家都很熟悉.在并发编程中,我们通过锁,来避免由于竞争而造成的数据不一致问题.通常,我们以synchronized .Lock来使用它. 但是Java中的锁,只能保证在同一个J ...
- JAVA实现Redis锁(加锁与解锁),快速高效实现Redis加锁与解锁
//获得锁 RLock locker = RedisUtil.getClient().getLock("锁的名字,例:Locker:TestLockA");//上锁 locker. ...
- 使用redis的setnx可以非同一线程进行加锁和解锁(附源码)
使用redis的setnx可以非同一线程进行加锁和解锁(附源码) 问题背景 项目搭建 总结 Lyric: 那在终点之前 问题背景 Redisson做分布式锁是目前比较流行的方式,但是在使用的过程中遇到 ...
- Redis实现分布式锁:加锁、解锁、续租和一致
目录 分布式锁及其应用场景 为何需要分布式锁 分布式锁的特性 互斥性 不死锁 一致性 可重入性 支持阻塞和非阻塞: 支持公平锁和非公平锁(可选) 使用原生Redis实现分布式锁 加锁 解锁 续租 如何 ...
- Redis系列-远程连接redis并给redis加锁
假设两台Redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...
- java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...
前言 为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantRead ...
- ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述)
- title: ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述) - date: 2021/8/16 文章目录 一.ReentrantLock 1. 构造函数 二.Reentr ...
- mysql数据库加锁语句_sql语句对数据库表进行加锁和解锁
锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库 ...
- UNIX操作系统中加锁和解锁
Unix操作系统加锁和解锁的基本思想是,当某个进程进入临界区,它将持有一个某种类型的锁(UNIX里一般来说是semaphore,Linux里一般是信号量和原子量或者spinlock).当其他进程在该进 ...
最新文章
- ADO.NET Entity Framework 简介
- 英文题,我恨你啊..
- hexo + Github 搭建问题综述
- rust营火为什么放不下去_从一个研发质量案例看,5why分析法,为什么分析不下去了?...
- Perform the Combo CodeForces - 1311C(字符串反转+树状数组)
- 利用Delphi-cross-socket 库提升kbmmw 跨平台开发
- Android权威编程指南读书笔记(1-2章)
- 免费可商用中文字体打包下载
- 2020届秋招中兴笔试题
- 深度解读:2021 中国低代码平台发展现状
- Excel功能逻辑结构图
- SoundTouch音频处理库
- 学习Hibernate框架笔记-第3天
- 调用Powergui FFT Analysis Tool进行FFT分析
- mysql XA 分布式事务、DTM TCC事务(多语言支持)
- 5.3 - 抽屉新热榜
- Java悲观锁Pessimistic-Lock常用实现场景
- 全国计算机一级证书重点知识,全国计算机一级
- excel中时间加分钟运算公式
- JavaScript练习--[使用js语言实现网页切换图片的效果]
热门文章
- 关于睡眠检测自定义VIEW
- html 发言样式,HTML样式
- 电脑文档被删了怎么恢复?小方法好助手
- mapbox-gl开发教程(二):地图主要配置参数说明
- 计算机毕业设计Java智能超市导购系统(源码+系统+mysql数据库+lw文档)
- 不用运动快速有效减肥——红光光浴#大健康#红光光浴#红光#种光光学
- i7 12700h和i5 12500h哪个好 酷睿12500H和12700H差别
- web前端做汽车之家官网,HTML5+CSS3+JS
- cdr 表格自动填充文字_长期伏案于表格,查看数据时你需要一个聚光灯效果
- LIN Bus | 一个应用广泛的串行通信协议