1. 分布式锁分类
- 数据库乐观锁
- 基于Redis的分布式锁
- 基于ZooKeeper的分布式锁
2. 组件依赖
pom.xml文件加入jedis开源组件:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
3. 使用
- 加锁方法
import redis.clients.jedis.JedisCluster;
@Resource
private JedisCluster jedisCluster;
final static int LOCK_TIMEOUT = 100;
/**
* 获得锁的方法
*/
public boolean tryLock(String key, String reqId) {
if (jedisCluster == null) {
logger.error("jedis cluster is null");
return false;
}
try {
int index = 0;
while (index < MAX_COUNT) {
String redisRet = jedisCluster.set(key, System.currentTimeMillis() + "", "NX", "EX", LOCK_TIMEOUT);
if ("OK" == redisRet) {
return true;
}
index++;
Thread.sleep(100);
}
// 超过最多重试获锁次数,返回失败
return false;
}catch(Exception e) {
logger.error(..);
return false;
}
}
加锁方法中的set函数里的参数解释可以参考我在下面放的参考文献。【mark】
- 释放锁方法
/**
* 释放锁
*/
public void realseLock(String key) {
try {
Long ret = jedisCluster.del(key);
if (ret != 1L) {
logger.warn("删除key失败,可能需要手工处理");
}
} catch(Exception e) {
logger.error(...);
}
}
这里的释放锁方法使用del()可能会有问题,公司目前使用的是该方法,可以参考我在下面放的参考文献。
- 整合使用
public T method() {
String lockKey = "XXX"; // 使用特点规则生成唯一的key
try {
boolean getLock = redisLockHandler.tryLock(lockKey, String reqId);
if (getLock) {
...
业务流程
...
}
} catch (Exception e) {
logger.error(...);
} finally {
redisLockHandler.realseLock(lockKey);
}
}
网友评论