public class SingleRedisLock
extends java.lang.Object
单节点Redis分布式重入锁, 依赖redis.clients:jedis
注意:
1.该锁适合单节点Redis, 集群Redis请使用RedLock.
2.Redis挂掉时, 获取/释放锁, 会抛出SingleRedisLock.LockException, 或超时.
3.获取锁时, expireSeconds参数非常重要. 该参数决定了redis中key的有效期, 相当于锁的有效期. 一旦锁内事务执行时间超过了该设定值,
就会有其他进程同时获得该锁. 因此, 该分布式锁适用于非耗时操作, expireSeconds应设置为较大的值, 避免出现超时的情况. 同时expireSeconds
也不能设置的太大, 持有锁的进程意外终止时, 锁要等到过期才能释放给其他进程.
//实例化jedis
@Bean
JedisPool jedisPool(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(5);
config.setMaxIdle(2);
config.setMinIdle(1);
config.setTestOnBorrow(true);
return new JedisPool(config, "127.0.0.1", 6379, 3000, null);
}
//实例化SingleRedisLock
@Bean
public SingleRedisLock simpleRedisLock(JedisPool jedisPool){
return new SingleRedisLock(jedisPool);
}
try {
//获取锁, 锁名1, 有效期60s, 等待时间1s, 重试时间0.01s
singleRedisLock.lock("1", 60, 1000L, 10L);
//处理非耗时事务
} catch (SingleRedisLock.TimeoutException e) {
//处理锁获取超时
} finally {
//重要: 释放锁
singleRedisLock.unLock("1");
}
| 限定符和类型 | 类和说明 |
|---|---|
static class |
SingleRedisLock.LockException
调用jedis访问redis时的异常
|
static class |
SingleRedisLock.TimeoutException
lock等待超时
|
| 构造器和说明 |
|---|
SingleRedisLock() |
SingleRedisLock(redis.clients.jedis.JedisPool jedisPool) |
| 限定符和类型 | 方法和说明 |
|---|---|
protected java.lang.String |
genToken() |
redis.clients.jedis.JedisPool |
getJedisPool() |
void |
lock(java.lang.String key,
int expireSeconds,
long waitTimeoutMillis,
long checkIntervalMillis)
获得锁, 获取失败会阻塞线程直到超时(waitTimeoutMillis), 重试间隔为checkIntervalMillis
|
void |
setJedisPool(redis.clients.jedis.JedisPool jedisPool) |
boolean |
tryLock(java.lang.String key,
int expireSeconds)
尝试获得锁, 获取失败立即返回false
|
boolean |
unLock(java.lang.String key)
释放锁
|
public SingleRedisLock()
public SingleRedisLock(redis.clients.jedis.JedisPool jedisPool)
public void lock(java.lang.String key,
int expireSeconds,
long waitTimeoutMillis,
long checkIntervalMillis)
throws SingleRedisLock.TimeoutException
key - 锁名称expireSeconds - 锁有效期, 单位:秒. expireSeconds参数非常重要. 该参数决定了redis中key的有效期, 相当于锁的有效期.
一旦锁内事务执行时间超过了该设定值, 就会有其他进程同时获得该锁. 因此, 该分布式锁适用于非耗时操作,
expireSeconds应设置为较大的值, 避免出现超时的情况. 同时expireSeconds也不能设置的太大, 持有锁的
进程意外终止时, 锁要等到过期才能释放给其他进程.waitTimeoutMillis - 最大等待时间, 单位:毫秒. 获取失败会阻塞线程直到超时.checkIntervalMillis - 获取失败重试间隔, 单位:毫秒.SingleRedisLock.TimeoutException - 锁获取超时public boolean tryLock(java.lang.String key,
int expireSeconds)
key - 锁名称expireSeconds - 锁有效期, 单位:秒. expireSeconds参数非常重要. 该参数决定了redis中key的有效期, 相当于锁的有效期.
一旦锁内事务执行时间超过了该设定值, 就会有其他进程同时获得该锁. 因此, 该分布式锁适用于非耗时操作,
expireSeconds应设置为较大的值, 避免出现超时的情况. 同时expireSeconds也不能设置的太大, 持有锁的
进程意外终止时, 锁要等到过期才能释放给其他进程.public boolean unLock(java.lang.String key)
key - 锁名称protected java.lang.String genToken()
public redis.clients.jedis.JedisPool getJedisPool()
public void setJedisPool(redis.clients.jedis.JedisPool jedisPool)