import redis.clients.jedis.Jedis;
import java.util.Collections;
/**
* redis 工具类
*/
public class RedisUtils {
/**
* 加锁成功返回的数据
*/
private static final String LOCK_SUCCESS = "OK";
/**
* 如果key不存在则进行添加
*/
private static final String SET_ID_NOT_EXIST = "NX";
/**
* 设置过期时间
*/
private static final String SET_WITH_EXPIRE_TIME = "PX";
/**
* 释放锁成功的返回值
*/
private static final Long RELEASE_SUCCESS = 1L;
/**
* 获取redis锁,使用原子方法获取并返回结果
*
* @param jedis jedis实例
* @param lockKey redis key
* @param requestId redis值,这里设置为请求id,为了实现加锁者才能解锁
* @param expireTime 过期时间
* @return 获取锁结果,true获取成功,false失败
*/
public boolean getLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
// 此处为原子操作
String result = jedis.set(lockKey, requestId, SET_ID_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
return LOCK_SUCCESS.equals(result);
}
/**
* 释放redis锁,使用执行命令的方式原子操作释放锁,并保证释放者就是加锁者
*
* @param jedis jedis实例
* @param lockKey redis key
* @param requestId redis值,这里设置为请求id,为了实现加锁者才能解锁
* @return 释放锁结果,true获取成功,false失败
*/
public static boolean releaseLock(Jedis jedis, String lockKey, 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 = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
return RELEASE_SUCCESS.equals(result);
}
}
redis获取锁和释放锁
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...