Loading...
正在加载...
请稍候

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

✨步子哥 (steper) 2025年10月16日 07:37
在 Redis 多机(即分布式)环境下使用 Redisson 时,常见的部署方式包括**主从模式**、**哨兵模式**和**集群模式**,每种方式都有其适用场景与一致性保障机制。 --- ### ✅ 一、Redisson 在多机 Redis 下的部署方式 Redisson 支持 Redis 的所有主流部署模式,配置方式如下: 1. **主从模式(Master-Slave)** 适用于读多写少的场景,主节点负责写,从节点负责读。 配置方式: ```java 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 类型 | 特点 | |------|----------|---------------|------| | 单值对象 | String | `RBucket` | 支持原子操作、过期时间、序列化 | | 映射 | Hash | `RMap`, `RMapCache` | 支持本地缓存、监听器、键值过期 | | 列表 | List | `RList` | 有序、可重复,支持索引访问 | | 集合 | Set | `RSet` | 无序、不可重复,支持集合运算 | | 有序集合 | Sorted Set | `RSortedSet`, `RScoredSortedSet` | 支持按分数排序、范围查询 | | 队列 | Queue | `RQueue`, `RBlockingQueue`, `RDelayedQueue` | FIFO、阻塞、延迟队列等 | | 双端队列 | Deque | `RDeque`, `RBlockingDeque` | 支持头尾操作 | | 优先级队列 | PriorityQueue | `RPriorityQueue` | 支持优先级排序 | | 原子变量 | AtomicLong, AtomicDouble | `RAtomicLong`, `RAtomicDouble` | 支持分布式原子操作 | | 布隆过滤器 | BloomFilter | `RBloomFilter` | 高效去重判断 | | BitSet | Bitmap | `RBitSet` | 位运算、签到、标记等 | | HyperLogLog | 基数统计 | `RHyperLogLog` | 大数据去重统计 | | 地理空间 | Geo | `RGeo` | 支持坐标存储与范围查询 | | 分布式锁 | Lock | `RLock`, `RReadWriteLock`, `RedLock` | 可重入、公平、红锁等 | | 信号量 | Semaphore | `RSemaphore`, `RPermitExpirableSemaphore` | 控制并发访问数量 | | 计数器 | CountDownLatch | `RCountDownLatch` | 分布式线程协调 | | 屏障 | CyclicBarrier | `RCyclicBarrier` | 多节点同步点 | | 发布订阅 | Pub/Sub | `RTopic` | 支持消息监听与广播 | --- ### ✅ 二、Redisson 支持 List 吗? 是的,**Redisson 支持 List**,对应的分布式类型是: - `RList`:基于 Redis 的 List 数据结构实现,支持有序、可重复元素。 #### 示例用法: ```java RList list = redisson.getList("myList"); // 添加元素 list.add("task1"); list.add("task2"); // 获取元素 String first = list.get(0); // 删除元素 list.remove("task1"); // 获取子列表 List subList = list.range(0, 2); ``` #### 应用场景: - 分布式消息队列(FIFO) - 操作日志、历史记录 - 排行榜(Top-N) - 分布式任务分片与调度 > 注意:`RList` 支持索引访问,但在中间插入/删除性能较差(O(n)),更适合头尾操作。若只需队列行为,推荐使用 `RQueue` 或 `RDeque`。 --- ### ✅ 总结 - Redisson 提供了极为丰富的分布式数据结构,几乎涵盖 Redis 所有原生类型,并增强为线程安全、支持监听、过期、事务等特性。 - **List 是支持的**,通过 `RList` 实现,适合有序、可重复、支持索引访问的场景。 - 若用于队列或高并发场景,建议优先考虑 `RQueue`、`RDeque` 或 `RBlockingQueue` 等更合适的结构。 ---