redis实现可重入锁
package com.jmdf.world;import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;/*** redis实现可重入锁,借助ThreadLocal*/
public class RedisWithReentrantLock {private ThreadLocal<Map> lockers = new ThreadLocal<>();private Jedis jedis;public RedisWithReentrantLock(Jedis jedis) {this.jedis = jedis;}private boolean _lock(String key) {return jedis.set(key, "", "nx", "ex", 5L) != null;}private void _unlock(String key) {jedis.del(key);}private Map<String, Integer> currentLockers() {Map<String, Integer> refs = lockers.get();if (refs != null) {return refs;}lockers.set(new HashMap<>());return lockers.get();}public boolean lock(String key) {Map refs = currentLockers();Integer refCnt = (Integer) refs.get(key);if (refCnt != null) {refs.put(key, refCnt + 1);return true;}boolean ok = this._lock(key);if (!ok) {return false;}refs.put(key, 1);return true;}public boolean unlock(String key) {Map refs = currentLockers();Integer refCnt = (Integer) refs.get(key);if (refCnt == null) {return false;}refCnt -= 1;if (refCnt > 0) {refs.put(key, refCnt);} else {refs.remove(key);this._unlock(key);}return true;}public static void main(String[] args) {Jedis jedis = new Jedis();RedisWithReentrantLock redis = new RedisWithReentrantLock(jedis);System.out.println(redis.lock("codehole"));System.out.println(redis.lock("codehole"));System.out.println(redis.unlock("codehole"));System.out.println(redis.unlock("codehole"));}
}
redis实现可重入锁相关推荐
- redis如何实现分布式重入锁
redis如何实现分布式重入锁? 在上一节课中,我们已经知道SETNX是不支持重入锁的,但我们需要重入锁,怎么办呢? 目前对于redis的重入锁业界还是有很多解决方案的,最流行的就是采用Redisso ...
- Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁
List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...
- Redis可重入锁的实现设计
1 可重入锁的需求 单纯的 Redis 分布式锁仍然有些场景不满⾜的,如⼀个⽅法获取到锁后,可能在⽅法内继续调这个⽅法,就获取不到锁了.这时就要把锁改进成可重⼊锁. 重⼊锁,是以线程为单位,当⼀个线程 ...
- redis分布式锁之redisson可重入锁
1.上篇讲了java里使用setNX实现redis分布式锁,可是这种方法还是有很多弊端的,追求完美的做法可以使用redisson来实现分布式锁,如下: 2.Redisson 是 java 的 Redi ...
- 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了
作者 | 李祥 责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...
- synchronized可重入锁
什么是可重入锁?它有什么作用? 可重入锁,也叫做递归锁,指的是在同一线程内,外层函数获得锁之后,内层递归函数仍然可以获取到该锁. 说白了就是同一个线程再次进入同样代码时,可以再次拿到该锁. 它的作用是 ...
- 【面试 分布式锁详细解析】续命 自旋锁 看门狗 重入锁,加锁 续命 解锁 核心源码,lua脚本解析,具体代码和lua脚本如何实现
Redisson实现分布式锁原理 自己实现锁续命 在 controller 里开一个 线程 (可以为 守护线程) 每10秒,判断一个 这个 UUID是否存在,如果 存在,重置为 30秒. 如果不存在, ...
- 基于 MySQL 排它锁实现分布式可重入锁解决方案
一.MySQL 排它锁和共享锁 在进行实验前,先来了解下MySQL 的排它锁和共享锁,在 MySQL 中的锁分为表锁和行锁,在行锁中锁又分成了排它锁和共享锁两种类型. 1. 排它锁 排他锁又称为写锁, ...
- Redisson的使用与可重入锁
目录 一.Redisson的使用 1.Redisson 2.导入依赖 3.建立Redssion配置类 4.使用 二.redisson的可重入锁 1.基本原理 2.test 3.图示 一.Redisso ...
最新文章
- 大数据在统计中的应用初探
- JUnit单元测试--IntelliJ IDEA
- QRadioButton Toggled() 使用方法
- brew install php55 报错 clang: error
- 练习_用if语句实现考试成绩划分
- AtCoder Beginner Contest 131 F - Must Be Rectangular!
- docker安装nextcloud(附nextcloud win7客户端下载教程)
- 深度学习笔记(21) 边缘检测
- bootstrap方法_中介效应中的bootstrap方法
- 小白初次攒机配置如何选择?
- C++构造函数与析构函数调用虚函数的注意事项
- 微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper
- Java设计模式pdf
- 太牛了! GitHub大牛呕心沥血整理的5000页Java学习手册文档
- win10诊断启动后联网_2步打开win10隐藏高级启动,解决80%系统问题
- java定义一个接口shape_定义一个借口shape
- 全球股市币市同迎黑色一天 熊市持现金或是王道 | 链塔快评
- 子元素自动撑开父元素空间
- 《Reducing Word Omission Errors in Neural Machine Translation:A Contrastive Learning Approach》论文阅读笔记
- 如何打造一个可躺赚的网盘项目,每天只需要2小时