一般在分布式项目中,如何保证数据的完整性以及安全性是我们必须要考虑的,基于这个原因,就出现了分布式锁.一般提到锁 基本就是为了处理数据的安全问题.今天记录下关于分布式锁.
分布式锁一般有三种实现方式: 1.数据库的乐观锁 2.Redis实现分布式锁 3.Zookeeper的分布式锁.
今天主要是讲述第二种,基于Redis实现分布式锁
一个分布式锁是否可用,它的前提需要以下四个条件:
1.无论什么时候锁只能是一个客户端拥有(互斥性)
2.无论什么时候不能出现死锁,这个时候需要在某偶一个客户端突然崩溃,而本身的锁要被释放.
3.要有容错性.
4.专一性.加锁与解锁必须针对一个客户端,不能唐朝的官斩宋朝的人.
使用Redis分布式锁 需要理解五个参数
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
/**
* 尝试获取分布式锁
* @param jedis Redis客户端
* @param Key 锁
* @param requestId 请求标识
* @param expireTime 超期时间
* @return 是否获取成功
*/
public static boolean Lock(Jedis jedis, String Key, String value, int
expireTime) {
String result = jedis.set(Key, value, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
}
参数解释:
key: 我们使用key当锁,因为这个key是唯一的.
value: 一般这个传来的是一个客户端的标识id值, 目的就是为了分清楚是哪个客户端请求而加上的锁
SET IF NOT EXIST: 即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作
SET_WITH_EXPIRE_TIME: 我们要给这个key加一个过期时间的设置
expireTime: 与SET_WITH_EXPIRE_TIME参数相呼应,代表key的过期时间。
这五个参数就可以将我们提出的四个条件全部满足.