什么是Redisson
Redisson是一个在Redis的基础上实现的Java驻留式客户端,它提供了丰富的数据结构和各种各样的分布式服务。
以下是Redisson提供的一些主要功能:
- 分布式实现和同步容器:包括
Map,Set,List,Queue等常用接口的分布式实现。 - 分布式锁和同步器:提供了
Lock,Semaphore,CountDownLatch等接口的分布式实现。 - 分布式服务:包括远程服务(Remote Service),延迟队列(Delayed Queue),发布订阅(Publish / Subscribe)等。
- Redis基本数据结构的接口:Redisson提供了对Redis基本数据结构如字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set)等的操作接口。
- Elasticache和AWS S3的支持:Redisson可以与Amazon的Elasticache和S3服务集成。
- Redis事务支持:Redisson支持Redis的事务功能。
- 其他功能:包括集群支持,连接池,编码转换等。
Redisson的目标是提供一种方式,使得开发者能够在分布式环境中,就像在单机环境中一样方便地使用各种Java数据结构和服务。
单间的代码示例
// 1. 首先,你需要创建一个RedissonClient实例
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
// 2. 然后,你可以获取一个锁对象
RLock lock = redisson.getLock("anyLock");
// 3. 最后,你可以使用这个锁来保护你的关键业务代码
try {
// 尝试获取锁,最多等待100秒,然后锁将自动释放
if (lock.tryLock(100, TimeUnit.SECONDS)) {
try {
// 在这里执行你的关键业务代码
} finally {
// 一旦你完成了你的业务代码,你必须释放锁
lock.unlock();
}
}
} catch (InterruptedException e) {
// 处理异常
}
这是一个简单的DEMO,你可能需要根据你的具体需求进行调整。比如,你可能需要更复杂的锁定策略,或者你可能需要处理更多的异常情况。
一些小提示:
- Redisson的RLock实现是和线程绑定的。如果同一个线程多次获取同一个锁,它将成功,而不会被阻塞。这是因为Redisson的RLock实现是可重入的。
- 在上面的DEMO中,锁的过期时间是通过
tryLock(long waitTime, TimeUnit unit)方法设置的。这个方法尝试在指定的等待时间内获取锁。如果在这个时间内获取到了锁,那么这个锁将在指定的租赁时间(lease time)结束后自动释放。如果没有指定租赁时间,那么默认的租赁时间是30秒。
如果你想要设置锁的过期时间,你可以使用tryLock(long waitTime, long leaseTime, TimeUnit unit)方法。例如,如果你想要锁在10分钟后过期,你可以这样做:
if (lock.tryLock(100, 10, TimeUnit.MINUTES)) {
// ...
}
在这段代码中,tryLock(100, 10, TimeUnit.MINUTES)方法有三个参数。
第一个参数100表示等待获取锁的最长时间。也就是说,如果锁被其他线程或进程持有,当前线程将等待最多100单位时间以获取该锁。如果在这段时间内锁被释放并且当前线程获取到了锁,那么该方法返回true;如果在这段时间内仍无法获取到锁,那么该方法返回false。
第二个参数10表示一旦获取到锁,锁将自动在10单位时间后释放,即使在这段时间内没有明确地调用unlock方法。这是一个防止死锁的机制,可以防止因为某个线程获取了锁但是没有释放,导致其他线程无法获取锁的情况。
第三个参数TimeUnit.MINUTES表示前两个参数的时间单位是分钟。所以这段代码的意思是,尝试等待最多100分钟来获取锁,一旦获取到锁,锁将在10分钟后自动释放。
tryLock()方法不会阻塞,如果无法立即获取锁,它将返回false。如果你想要在无法获取锁时阻塞当前线程,你可以使用lock()方法。
需要注意的是,过期时间是从锁成功获取的时刻开始计算的。如果你的业务代码执行时间超过了这个时间,那么锁将会被自动释放,即使你的代码还没有执行完。因此,你需要确保你的过期时间足够长,以防止这种情况的发生。