1、redis设置key时上锁
参考怎样实现redis分布式锁?
package com.test;
import com.utils.JedisUtil;
import redis.clients.jedis.Jedis;
import java.util.*;
public class Test09_Redis {
private static final Long SUCCESS = 1L;
private static Jedis jedis = new Jedis("127.0.0.1");
public static void main(String[] args) {
// Jedis jedis = JedisUtil.getJedis();
// JedisUtil.close(jedis);
boolean b = tryLock("1", "123");
boolean b1 = unLock("1", "123");
System.out.println("b= " + b + " b1= " + b1);
}
// public boolean tryLock2(String key, String requestId, int expireTime) {
// //使用jedis的api,保证原子性
// //NX 不存在则操作 EX 设置有效期,单位是秒
// // String result = jedis.set(key, requestId, "NX", "EX", expireTime);
// String result = jedis.set(key, requestId, expireTime);
// //返回OK则表示加锁成功
// return "OK".equals(result);
// }
/**
* 加锁
*/
public static boolean tryLock(String key, String requestId) {
//使用setnx命令。
//不存在则保存返回1,加锁成功。如果已经存在则返回0,加锁失败。
return SUCCESS.equals(JedisUtil.getJedis().setnx(key, requestId));
}
//删除key的lua脚本,先比较requestId是否相等,相等则删除
private static final String DEL_SCRIPT = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end";
/**
* 解锁
*/
public static boolean unLock(String key, String requestId) {
//删除成功表示解锁成功
Long result = (Long) jedis.eval(DEL_SCRIPT, Collections.singletonList(key),
Collections.singletonList(requestId));
return SUCCESS.equals(result);
}
}
Redis 如何实现redis分布式锁