package com.example.demo.util;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: lihaozhen
* @Date: 2020/6/20 23:12
* @Description:redis 可重如锁
*/
public class RedisWitReentrantLock {
private ThreadLocal<Map<String,Integer>> lockers = new ThreadLocal<>();
private Jedis jedis;
public RedisWitReentrantLock(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> currentLocakers(){
Map<String,Integer> refs = lockers.get();
if (refs != null){
return refs;
}
lockers.set(new HashMap<>());
return lockers.get();
}
public boolean lock(String key){
Map<String,Integer>refs = currentLocakers();
Integer refCnt = 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<String,Integer> refs = currentLocakers();
Integer refCnt = 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();
RedisWitReentrantLock redis = new RedisWitReentrantLock(jedis);
System.out.println(redis.lock("lihaozhen"));
System.out.println(redis.lock("lihaozhen"));
System.out.println(redis.unlock("lihaozhen"));
System.out.println(redis.unlock("lihaozhen"));
}
}
依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>