Redis分布式锁
Jedis-lock
简介
- Jedis-lock is easy to use and simple implementation of distributed lock using Redis database and Jedis driver.
Jedis-lock 是简单的被使用,而且是使用redis数据库和jedis驱动实现分布式锁的一种简单实现
原理
- 方法上加锁synchronized,每次传入key,会将key进行setnx操作,SETNX 是[SET if Not eXists] (如果不存在,则 SET)的简写。
返回值:
设置成功,返回 1 。
设置失败,返回 0 。
- 上锁之后进行业务操作,操作完成释放锁,其实就是del key 操作.
代码实现
Jedis jedis = new Jedis("39.106.136.84", 6379);
/**
* @param jedis 连接
* @param lockKey lock key (ex. account:1, ...) 锁名称
* @param timeoutSecs acquire timeout in miliseconds (default: 10000 msecs) 获取锁的超时时间10s
* @param expireMsecs lock expiration in miliseconds (default: 60000 msecs) 锁的过期时间60s
*/
JedisLock lock = new JedisLock(jedis, "lockname", 10000, 30000);
lock.acquire();
try {
// 业务逻辑
} finally {
lock.release();
}
https://github.com/abelaska/jedis-lock/blob/master/README.md
Redis-lock
简介
- Raddison provides a distributed implementation of reentrant java.util.concurrent.locks.Lock with TTL support and could provide pointers for a generic implementation.
Raddison提供了一个可重入的java.util.concurrent.locks的分布式实现。锁被TTL支持,并可以为通用实现提供指针。
原理
- setex 将值 value 关联到 key ,并将 key 的生存时间设为xx seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。
这个命令类似于以下两个命令:
SET key value
EXPIRE key seconds # 设置生存时间
不同之处是, SETEX是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
eg: setex key expiretime value;
代码实现
@Autowired
StringRedisTemplate template;
@RequestMapping(value = "/redis")
public void redis() {
/*
* 锁:(ECPS:aaa,"\tweifan-PC\x03aaa\x14http-nio-5555-exec-1\x00\x00\x01b\x89l\xe21")
*/
RedisLockRegistry lockRegistry = new RedisLockRegistry(template.getConnectionFactory(), "ECPS");
Lock lock = lockRegistry.obtain("aaa");
try {
lock.lock();// 获取到锁
// 执行业务
} catch (Exception e) {
// 异常处理
} finally {
lock.unlock();// 释放锁
}
}