redis分布式锁实现
来源:互联网 发布:人工智能图片大全 编辑:程序博客网 时间:2024/06/07 20:18
public synchronized boolean getLock2(final String lockKeyPrefix, final String lockKeySuffix) {
int retryTimes = 5; //重试次数
while (true) {
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> redisSerializer = redisTemplate.getStringSerializer();
byte[] key = redisSerializer.serialize(lockKeyPrefix);
final String expireTime = String.valueOf(System.currentTimeMillis() + Long.valueOf(CreditAccountCode.DATA_LOCK_EXPIRE_MILLIS.getCode())) + "_" + lockKeySuffix;
byte[] value = redisSerializer.serialize(expireTime);
return redisConnection.setNX(key, value);
}
});
if (result) {
return true;
} else {
String lockValue = (String) redisTemplate.opsForValue().get(lockKeyPrefix);
Long oldExpireTime = Long.valueOf(lockValue.split("_")[0]);
Long currentTime = System.currentTimeMillis();
if (oldExpireTime < currentTime) { //已经超时
Long newExpireTime = currentTime + Long.valueOf(CreditAccountCode.DATA_LOCK_EXPIRE_MILLIS.getCode());
String preLockValue = (String) redisTemplate.opsForValue().getAndSet(lockKeyPrefix, String.valueOf(newExpireTime) + "_" + lockKeySuffix);
Long currentExpireTime = Long.valueOf(preLockValue.split("_")[0]);
if (currentExpireTime.equals(oldExpireTime)) {
return true;
} else {
try {
if (retryTimes > 0) {
Thread.sleep(300); //等待300毫秒重试
retryTimes--;
// System.out.println("-------------------------------" + retryTimes);
continue;
} else {
return false;
}
} catch (InterruptedException e) {
logger.error(e.getMessage());
return false;
}
}
} else {
try {
if (retryTimes > 0) {
Thread.sleep(300); //等待300毫秒重试
retryTimes--;
// System.out.println("-------------------------------" + retryTimes);
continue;
} else {
return false;
}
} catch (InterruptedException e) {
logger.error(e.getMessage());
return false;
}
}
}
}
}
public synchronized void delLock2(String lockKeyPrefix, String lockKeySuffix) {
Long currentTime = System.currentTimeMillis();
String expireTimeString = (String) redisTemplate.opsForValue().get(lockKeyPrefix);
if (expireTimeString != null) {
Long expirTime = Long.valueOf(expireTimeString.split("_")[0]);
if (currentTime < expirTime && lockKeySuffix.equals(expireTimeString.split("_")[1])) {
redisTemplate.delete(lockKeyPrefix);
}
}
}
int retryTimes = 5; //重试次数
while (true) {
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> redisSerializer = redisTemplate.getStringSerializer();
byte[] key = redisSerializer.serialize(lockKeyPrefix);
final String expireTime = String.valueOf(System.currentTimeMillis() + Long.valueOf(CreditAccountCode.DATA_LOCK_EXPIRE_MILLIS.getCode())) + "_" + lockKeySuffix;
byte[] value = redisSerializer.serialize(expireTime);
return redisConnection.setNX(key, value);
}
});
if (result) {
return true;
} else {
String lockValue = (String) redisTemplate.opsForValue().get(lockKeyPrefix);
Long oldExpireTime = Long.valueOf(lockValue.split("_")[0]);
Long currentTime = System.currentTimeMillis();
if (oldExpireTime < currentTime) { //已经超时
Long newExpireTime = currentTime + Long.valueOf(CreditAccountCode.DATA_LOCK_EXPIRE_MILLIS.getCode());
String preLockValue = (String) redisTemplate.opsForValue().getAndSet(lockKeyPrefix, String.valueOf(newExpireTime) + "_" + lockKeySuffix);
Long currentExpireTime = Long.valueOf(preLockValue.split("_")[0]);
if (currentExpireTime.equals(oldExpireTime)) {
return true;
} else {
try {
if (retryTimes > 0) {
Thread.sleep(300); //等待300毫秒重试
retryTimes--;
// System.out.println("-------------------------------" + retryTimes);
continue;
} else {
return false;
}
} catch (InterruptedException e) {
logger.error(e.getMessage());
return false;
}
}
} else {
try {
if (retryTimes > 0) {
Thread.sleep(300); //等待300毫秒重试
retryTimes--;
// System.out.println("-------------------------------" + retryTimes);
continue;
} else {
return false;
}
} catch (InterruptedException e) {
logger.error(e.getMessage());
return false;
}
}
}
}
}
public synchronized void delLock2(String lockKeyPrefix, String lockKeySuffix) {
Long currentTime = System.currentTimeMillis();
String expireTimeString = (String) redisTemplate.opsForValue().get(lockKeyPrefix);
if (expireTimeString != null) {
Long expirTime = Long.valueOf(expireTimeString.split("_")[0]);
if (currentTime < expirTime && lockKeySuffix.equals(expireTimeString.split("_")[1])) {
redisTemplate.delete(lockKeyPrefix);
}
}
}
阅读全文
0 0
- Redis实现分布式锁
- Redis 分布式锁实现
- Redis 分布式锁实现
- Redis实现分布式锁
- redis实现分布式锁
- Redis实现分布式锁
- 分布式锁redis实现
- Redis 分布式锁实现
- redis分布式锁实现
- redis实现分布式锁
- Redis分布式锁实现
- redis分布式锁实现
- redis实现分布式锁
- Redis分布式锁实现
- Redis实现分布式锁
- Redis实现分布式锁
- redis实现分布式锁
- Redis实现分布式锁
- Android Studio使用Git管理分支,合并分支
- 多尺度血管增强滤波
- 浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
- c运行库、c标准库、windows API都是什么玩意
- C语言中的nan和inf 的判断和使用
- redis分布式锁实现
- 自己写的一款基于移动端的图片浏览器插件
- tomcat8 编写字符编码Filter过滤器无效问题
- Android 微信分享链接部分手机无法成功分享
- SuperMap iMobile for Android许可配置介绍
- HDU2577
- Android 中 c 代码回调Java代码的详细步骤(jni、NDK的使用)
- 图片的压缩
- 面试题目3:二维数组中的查找