您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

在 Redis 多机(即分布式)环境下使用 Redisson

✨步子哥 (steper) 2025年10月16日 07:37 0 次浏览

在 Redis 多机(即分布式)环境下使用 Redisson 时,常见的部署方式包括主从模式哨兵模式集群模式,每种方式都有其适用场景与一致性保障机制。


✅ 一、Redisson 在多机 Redis 下的部署方式

Redisson 支持 Redis 的所有主流部署模式,配置方式如下:

  1. 主从模式(Master-Slave)
适用于读多写少的场景,主节点负责写,从节点负责读。 配置方式:
   config.useMasterSlaveServers()
         .setMasterAddress("redis://master:6379")
         .addSlaveAddress("redis://slave1:6379", "redis://slave2:6379");
   ```

2. **哨兵模式(Sentinel)**  
   提供高可用性,哨兵节点监控主节点状态,主节点宕机时自动切换。  
   配置方式:
   ```java
   config.useSentinelServers()
         .setMasterName("mymaster")
         .addSentinelAddress("redis://sentinel1:26379", "redis://sentinel2:26379");
   ```

3. **集群模式(Cluster)**  
   支持数据分片,适合大规模数据和高并发场景。  
   配置方式:
   ```java
   config.useClusterServers()
         .addNodeAddress("redis://node1:6379", "redis://node2:6379");
   ```

---

### ✅ 二、如何保证数据一致性

在多机 Redis 环境中,由于主从同步延迟、节点故障或网络分区等问题,**数据一致性**成为关键挑战。Redisson 提供以下机制保障一致性:

#### 1. **分布式锁(RLock)**
确保同一时刻只有一个线程/节点能操作关键资源,避免并发冲突。
java RLock lock = redisson.getLock("productLock"); lock.lock(); try { // 更新数据库 db.update(product); // 删除缓存 cache.remove(product.getId()); } finally { lock.unlock(); }


#### 2. **读写锁(RReadWriteLock)**
支持多读单写,适合读多写少的场景,提升并发性能。

java
RReadWriteLock rwLock = redisson.getReadWriteLock("productLock");
RLock readLock = rwLock.readLock();
readLock.lock();
try {
// 读操作
} finally {
readLock.unlock();
}


#### 3. **原子操作(基于 Lua 脚本)**
Redisson 使用 Lua 脚本保证多个 Redis 命令的原子性执行,避免中间状态被其他客户端干扰。

java
RScript script = redisson.getScript();
script.eval(RScript.Mode.READ_WRITE, "redis.call('set', KEYS[1], ARGV[1]);", RScript.ReturnType.VALUE, keys, values);


#### 4. **事务支持(RTransaction)**
Redisson 提供分布式事务机制,支持多个操作的原子提交或回滚。

java
RTransaction transaction = redisson.createTransaction(TransactionOptions.defaults());
try {
RMap map = transaction.getMap("myMap");
map.put("key1", "value1");
map.put("key2", "value2");
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}


#### 5. **主从强一致性读(getAndSet 等)**
在读写分离场景下,Redisson 提供如 `getAndSet()` 等方法,**强制路由到主节点执行**,避免读取到延迟的旧数据。

java
RBucket bucket = redisson.getBucket("myBucket");
String oldValue = bucket.getAndSet("newValue"); // 强制主节点执行
```


✅ 三、最佳实践建议

场景推荐策略
读多写少使用主从 + 读写锁 + 本地缓存
强一致性要求使用分布式锁 + 写后删缓存 + 主节点读
高并发写使用集群模式 + 分布式锁 + 事务
异步更新使用消息队列 + 最终一致性策略

✅ 总结

Redisson 在 Redis 多机环境下通过支持主从、哨兵、集群等多种部署模式,并结合分布式锁、读写锁、Lua 脚本、事务机制等手段,有效保障了分布式系统中的数据一致性问题。根据业务对一致性的要求,合理选择部署模式和一致性策略,可以在性能与一致性之间取得良好平衡。

讨论回复

1 条回复
QianXun (QianXun) #1
10-16 08:18

Redisson 支持非常丰富的分布式数据结构,几乎覆盖了 Java 标准集合框架的所有常用类型,并在此基础上扩展了分布式特性(如原子操作、监听、过期策略等)。以下是 Redisson 支持的主要分布式数据结构类别及说明:


✅ 一、Redisson 支持的分布式数据结构

类别数据结构Redisson 类型特点
单值对象StringRBucket支持原子操作、过期时间、序列化
映射HashRMap, RMapCache支持本地缓存、监听器、键值过期
列表ListRList有序、可重复,支持索引访问
集合SetRSet无序、不可重复,支持集合运算
有序集合Sorted SetRSortedSet, RScoredSortedSet支持按分数排序、范围查询
队列QueueRQueue, RBlockingQueue, RDelayedQueueFIFO、阻塞、延迟队列等
双端队列DequeRDeque, RBlockingDeque支持头尾操作
优先级队列PriorityQueueRPriorityQueue支持优先级排序
原子变量AtomicLong, AtomicDoubleRAtomicLong, RAtomicDouble支持分布式原子操作
布隆过滤器BloomFilterRBloomFilter高效去重判断
BitSetBitmapRBitSet位运算、签到、标记等
HyperLogLog基数统计RHyperLogLog大数据去重统计
地理空间GeoRGeo支持坐标存储与范围查询
分布式锁LockRLock, RReadWriteLock, RedLock可重入、公平、红锁等
信号量SemaphoreRSemaphore, RPermitExpirableSemaphore控制并发访问数量
计数器CountDownLatchRCountDownLatch分布式线程协调
屏障CyclicBarrierRCyclicBarrier多节点同步点
发布订阅Pub/SubRTopic支持消息监听与广播

✅ 二、Redisson 支持 List 吗?

是的,Redisson 支持 List,对应的分布式类型是:

  • RList<T>:基于 Redis 的 List 数据结构实现,支持有序、可重复元素。

示例用法:

RList<String> list = redisson.getList("myList");

// 添加元素
list.add("task1");
list.add("task2");

// 获取元素
String first = list.get(0);

// 删除元素
list.remove("task1");

// 获取子列表
List<String> subList = list.range(0, 2);

应用场景:

  • 分布式消息队列(FIFO)
  • 操作日志、历史记录
  • 排行榜(Top-N)
  • 分布式任务分片与调度
注意:RList 支持索引访问,但在中间插入/删除性能较差(O(n)),更适合头尾操作。若只需队列行为,推荐使用 RQueueRDeque

✅ 总结

  • Redisson 提供了极为丰富的分布式数据结构,几乎涵盖 Redis 所有原生类型,并增强为线程安全、支持监听、过期、事务等特性。
  • List 是支持的,通过 RList 实现,适合有序、可重复、支持索引访问的场景。
  • 若用于队列或高并发场景,建议优先考虑 RQueueRDequeRBlockingQueue 等更合适的结构。