Redisson分布式锁
·
Redisson 是一个基于 Redis 的 Java 客户端,提供了分布式锁、分布式集合、分布式对象等丰富的分布式功能,极大简化了 Redis 在分布式系统中的应用。以下是 Redisson 的详细使用教程:
一、环境准备
1. 引入依赖
在 Maven 项目的 pom.xml 中添加 Redisson 依赖:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.23.3</version> <!-- 建议使用最新稳定版 -->
</dependency>
2. 配置 Redisson 客户端
Redisson 支持多种配置方式(YAML、JSON、Java 代码),以下是最常用的 Java 代码配置:
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonConfig {
public static RedissonClient getRedissonClient() {
// 创建配置对象
Config config = new Config();
// 单节点模式(生产环境建议用集群/主从模式)
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379") // Redis 地址
.setPassword("123456") // 若有密码
.setDatabase(0) // 数据库编号(默认 0)
.setConnectionPoolSize(50); // 连接池大小
// 集群模式示例(按需选择)
// config.useClusterServers()
// .addNodeAddress("redis://127.0.0.1:7001", "redis://127.0.0.1:7002");
// 创建并返回 Redisson 客户端
return Redisson.create(config);
}
}
二、核心功能使用示例
1. 分布式锁(最常用功能)
Redisson 的分布式锁基于 Redis 实现,支持自动续约、可重入、公平锁等特性。
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
public class DistributedLockExample {
public static void main(String[] args) {
// 获取 Redisson 客户端
RedissonClient redisson = RedissonConfig.getRedissonClient();
// 获取锁对象(锁的 key 为 "order_lock")
RLock lock = redisson.getLock("order_lock");
try {
// 尝试获取锁:最多等待 10 秒,10 秒内未获取则失败;锁自动释放时间为 30 秒
boolean isLocked = lock.tryLock(10, 30, java.util.concurrent.TimeUnit.SECONDS);
if (isLocked) {
// 获得锁后执行临界区代码(如创建订单、扣减库存)
System.out.println("获取锁成功,执行业务逻辑...");
Thread.sleep(5000); // 模拟业务操作
} else {
System.out.println("获取锁失败,可能有其他线程占用");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 确保锁释放(只有持有锁的线程才能释放)
if (lock.isHeldByCurrentThread()) {
lock.unlock();
System.out.println("释放锁成功");
}
}
// 关闭客户端(实际应用中通常全局单例,无需频繁关闭)
redisson.shutdown();
}
}
特性说明:
- 可重入性:同一线程可多次获取同一把锁,不会死锁。
- 自动续约:若业务执行时间超过锁的过期时间,Redisson 会自动延长锁的有效期(看门狗机制)。
- 公平锁:通过
redisson.getFairLock("key")获取公平锁,按请求顺序获取锁,避免饥饿。
2. 分布式对象(如字符串、映射)
Redisson 提供了与 Java 集合类相似的分布式对象接口,操作简单。
import org.redisson.api.RMap;
import org.redisson.api.RString;
import org.redisson.api.RedissonClient;
public class DistributedObjectExample {
public static void main(String[] args) {
RedissonClient redisson = RedissonConfig.getRedissonClient();
// 1. 分布式字符串(类似 Redis 的 String)
RString str = redisson.getString("user_name");
str.set("zhangsan");
System.out.println("获取字符串值:" + str.get());
// 2. 分布式映射(类似 Redis 的 Hash)
RMap<String, Object> userMap = redisson.getMap("user:1001");
userMap.put("name", "张三");
userMap.put("age", 25);
userMap.put("gender", "男");
System.out.println("获取用户姓名:" + userMap.get("name"));
System.out.println("用户所有属性:" + userMap.readAllMap());
redisson.shutdown();
}
}
3. 分布式集合(如列表、集合、有序集合)
import org.redisson.api.RList;
import org.redisson.api.RSet;
import org.redisson.api.RedissonClient;
public class DistributedCollectionExample {
public static void main(String[] args) {
RedissonClient redisson = RedissonConfig.getRedissonClient();
// 1. 分布式列表(类似 Redis 的 List)
RList<String> list = redisson.getList("product_ids");
list.add("p1001");
list.add("p1002");
list.add("p1003");
System.out.println("列表元素:" + list);
System.out.println("获取索引 1 的元素:" + list.get(1));
// 2. 分布式集合(类似 Redis 的 Set,去重)
RSet<String> set = redisson.getSet("tag_set");
set.add("java");
set.add("redis");
set.add("java"); // 重复元素不会被添加
System.out.println("集合元素:" + set);
redisson.shutdown();
}
}
4. 分布式计数器
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
public class CounterExample {
public static void main(String[] args) {
RedissonClient redisson = RedissonConfig.getRedissonClient();
// 分布式原子长整型(计数器)
RAtomicLong counter = redisson.getAtomicLong("order_count");
// 初始值设为 0
counter.set(0);
// 自增 1(返回自增后的值)
long count1 = counter.incrementAndGet();
System.out.println("自增后:" + count1); // 输出 1
// 自增 5
long count2 = counter.addAndGet(5);
System.out.println("再增 5 后:" + count2); // 输出 6
redisson.shutdown();
}
}
5. 布隆过滤器(解决缓存穿透)
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
public class BloomFilterExample {
public static void main(String[] args) {
RedissonClient redisson = RedissonConfig.getRedissonClient();
// 创建布隆过滤器(预计元素量 100000,误判率 0.01)
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("user_id_filter");
bloomFilter.tryInit(100000, 0.01);
// 添加有效用户 ID
bloomFilter.add("1001");
bloomFilter.add("1002");
bloomFilter.add("1003");
// 测试判断
System.out.println("1001 是否存在?" + bloomFilter.contains("1001")); // true
System.out.println("2000 是否存在?" + bloomFilter.contains("2000")); // false(大概率)
redisson.shutdown();
}
}
三、高级特性
1. 读写锁(ReadWriteLock)
适合 “读多写少” 场景,允许多个读操作同时进行,写操作独占锁:
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
public class ReadWriteLockExample {
public static void main(String[] args) {
RedissonClient redisson = RedissonConfig.getRedissonClient();
RReadWriteLock rwLock = redisson.getReadWriteLock("data_rw_lock");
// 读锁(多个线程可同时获取)
rwLock.readLock().lock();
// 执行读操作...
rwLock.readLock().unlock();
// 写锁(独占,其他读/写锁需等待)
rwLock.writeLock().lock();
// 执行写操作...
rwLock.writeLock().unlock();
redisson.shutdown();
}
}
2. 信号量(Semaphore)
用于控制并发访问的资源数量:
import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient;
public class SemaphoreExample {
public static void main(String[] args) throws InterruptedException {
RedissonClient redisson = RedissonConfig.getRedissonClient();
RSemaphore semaphore = redisson.getSemaphore("resource_semaphore");
// 设置资源数量为 3(最多 3 个线程同时访问)
semaphore.trySetPermits(3);
// 获取资源(若资源不足则阻塞)
semaphore.acquire();
// 执行操作...
// 释放资源
semaphore.release();
redisson.shutdown();
}
}
四、注意事项
- 客户端单例:
RedissonClient是线程安全的,建议全局只创建一个实例,避免频繁创建销毁。 - 异常处理:锁操作需在
finally中释放,避免死锁。 - Redis 版本兼容:Redisson 3.x 需 Redis 2.8 及以上版本,建议使用 Redis 5.0+ 以获得更好性能。
- 集群配置:生产环境优先使用 Redis 集群 + Redisson 集群模式,保证高可用。
- 性能调优:根据业务场景调整连接池大小、锁超时时间等参数,避免资源浪费或性能瓶颈。
总结
Redisson 封装了 Redis 的底层操作,提供了贴近 Java 原生 API 的分布式工具,尤其在分布式锁、分布式集合等场景中表现优异。通过本教程的示例,可快速上手 Redisson 的核心功能,实际应用中需结合业务需求选择合适的组件和配置。
更多推荐

所有评论(0)