在 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
登录后可参与表态