前言
分布式锁一般有几种实现方式,redis分布式锁,ZooKeeper分布式锁,数据库乐观锁,本文将讲解redis分布式锁的使用
何为分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。所以:
分布式锁具有互斥性,同一时间只能有一个客户端拥有这把锁
组件依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
加锁
public boolean tryLock(String key,int timeOut){
key = getPreKey(key);
ShardedJedis conn = null;
try {
conn = redisXmlConfigure.getConnection();
String result=conn.set(key, key+":lock", "NX", "EX", timeOut);
return "OK".equals(result)?true:false;
}catch(Exception e) {
if(conn==null) {
conn = redisXmlConfigure.getConnection();
}
conn.del(key);
return false;
} finally {
redisXmlConfigure.closeConnection(conn);
}
}
我们在这里使用到了jedis.set(String key, String value, String nxxx, String expx, int time)方法
1,key则为主键key,需要保证唯一
2,value对应的值,我们也可以存入其他数据,例如这个锁的归属,然后判断是不是这个人在释放锁,可以根据需求灵活选择
3,这个值控制的当key存在还是不存在的时候进行操作,NX是不存在的时候进行操作,XX是存在的时候进行操作
4,这个控制过期时间类型,PX是毫秒,EX表示秒,与第五个参数呼应
5,设置过期时间,设置为10,第四个参数设置为PX则为10毫秒过期,第四个参数设置为EX则为10秒过期
解锁
/**
* 释放锁
* 严格意义上讲,这种写法有问题,未做释放锁的权限判断
* @param key
*/
public void releaseLock(String key){
key = getPreKey(key);
ShardedJedis conn = null;
try {
conn = redisXmlConfigure.getConnection();
conn.del(key);
} finally {
redisXmlConfigure.closeConnection(conn);
}
}
业务操作完成主动释放锁
简单使用
if(cacheService.tryLock("test:key", 10)) {
//处理业务逻辑
//省略N行代码
cacheService.releaseLock("test:key");
}