分布式锁的几种实现方法:redis实现分布式锁
2023-09-11 14:16:54 时间
import redis.clients.jedis.Jedis;
/**
* 使用redis实现分布式锁(推荐)
*
*/
public class JedLock {
private static final String LOCK_KEY = "jedis_lock";
private static final int RETRY_TIME = 10 * 1000; //等待锁的时间
private static final int EXPIRE_TIME = 60 * 1000;//锁超时的时间
private boolean locked;
private long lockValue;
public synchronized boolean lock(Jedis jedis){
int retryTime = RETRY_TIME;
try {
while (retryTime > 0) {
lockValue = System.nanoTime();
if ("OK".equalsIgnoreCase(jedis.set(LOCK_KEY, String.valueOf(lockValue), "NX", "PX", EXPIRE_TIME))) {
locked = true;
return locked;
}
retryTime -= 100;
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public synchronized void unlock(Jedis jedis){
if(locked) {
String currLockVal = jedis.get(LOCK_KEY);
if(currLockVal!=null && Long.valueOf(currLockVal) == lockValue){
jedis.del(LOCK_KEY);
locked = false;
}
}
}
public static void main(String[] args) throws InterruptedException {
Jedis jedis = new Jedis("192.168.75.129", 6379);
JedLock redLock = new JedLock();
if(redLock.lock(jedis)) {
System.out.println(Thread.currentThread().getName() + ": 获得锁!");
Thread.sleep(25000);
System.out.println(Thread.currentThread().getName() + ": 处理完成!");
redLock.unlock(jedis);
System.out.println(Thread.currentThread().getName() + ": 释放锁!");
}else {
System.out.println("get lock fail!!!");
}
}
}
import redis.clients.jedis.Jedis;
/**
* 使用redis实现分布式锁
*
*/
public class RedLock {
private static final String LOCK_KEY = "redis_lock";
private static final int RETRY_TIME = 10 * 1000; //等待锁的时间
private static final int EXPIRE_TIME = 60 * 1000;//锁超时的时间
private boolean locked;
private long lockValue;
public synchronized boolean lock(Jedis jedis){
int retryTime = RETRY_TIME;
try {
while (retryTime > 0) {
lockValue = System.currentTimeMillis() + EXPIRE_TIME + 1;//锁到期时间
String lockValueStr = String.valueOf(lockValue);
//判断能否获取锁
if (jedis.setnx(LOCK_KEY, lockValueStr) == 1) {
//成功获取锁
locked = true;
return locked;
}
String currLockVal = jedis.get(LOCK_KEY);
// 判断锁是否已经失效
if (currLockVal != null && Long.valueOf(currLockVal) < System.currentTimeMillis()) {
//锁已经失效,使用命令getset设置最新的过期时间
String oldLockVal = jedis.getSet(LOCK_KEY, lockValueStr);
//判断锁是否已经被抢占
if (oldLockVal != null && oldLockVal.equals(currLockVal)) {
locked = true;
return locked;
}
}
retryTime -= 100;
Thread.sleep(100);
}
}catch (Exception e){
e.printStackTrace();
}
return false;
}
public synchronized void unlock(Jedis jedis){
if(locked) {
String currLockVal = jedis.get(LOCK_KEY);
if(currLockVal != null && Long.valueOf(currLockVal) == lockValue) {
jedis.del(LOCK_KEY);
locked = false;
}
}
}
public static void main(String[] args) throws InterruptedException {
Jedis jedis = new Jedis("192.168.75.129", 6379);
RedLock redLock = new RedLock();
if(redLock.lock(jedis)) {
System.out.println(Thread.currentThread().getName() + ": 获得锁!");
Thread.sleep(150000);
System.out.println(Thread.currentThread().getName() + ": 处理完成!");
redLock.unlock(jedis);
System.out.println(Thread.currentThread().getName() + ": 释放锁!");
}else {
System.out.println("get lock fail!!!");
}
}
}
相关文章
- 判断Redis复制是否完成的方法
- 动态添加Redis密码认证的方法
- yii2:redis调用
- redis实践:用户注册登录功能
- Redis学习(8)-redis持久化
- redis 简单整理——复制配置[二十二]
- centos安装redis及php-redis扩展
- Docker搭建Redis高可用集群(基于redis-sentinel)
- Redis开发:高阶/低阶API的使用及K,V序列化
- 〖Python 数据库开发实战 - Python与Redis交互篇⑦〗- 利用 redis-py 实现缓存学生考试信息
- 〖Python 数据库开发实战 - Python与Redis交互篇⑪〗- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis
- redis线程模型
- redis_05 _ 内存快照:宕机后,Redis如何实现快速恢复
- centos安装redis并且加入开机启动
- set集合类型 redis
- Redis-3.2.0集群配置(redis cluster)
- Redis Config Get 命令
- 【C++ 科学计算】redis-plus-plus:安装用C ++编写的Redis客户端
- springboot使用redis(StringRedisTemplate的常用方法)
- 【redis源码分析】Redis Sentinel 是如何实际解决分布式共识问题的