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

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

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

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


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

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

  1. 主从模式(Master-Slave)
    适用于读多写少的场景,主节点负责写,从节点负责读。
    配置方式:

    config.useMasterSlaveServers()
          .setMasterAddress("redis://master:6379")
          .addSlaveAddress("redis://slave1:6379", "redis://slave2:6379");
    
  2. 哨兵模式(Sentinel)
    提供高可用性,哨兵节点监控主节点状态,主节点宕机时自动切换。
    配置方式:

    config.useSentinelServers()
          .setMasterName("mymaster")
          .addSentinelAddress("redis://sentinel1:26379", "redis://sentinel2:26379");
    
  3. 集群模式(Cluster)
    支持数据分片,适合大规模数据和高并发场景。
    配置方式:

    config.useClusterServers()
          .addNodeAddress("redis://node1:6379", "redis://node2:6379");
    

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

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

1. 分布式锁(RLock)

确保同一时刻只有一个线程/节点能操作关键资源,避免并发冲突。

RLock lock = redisson.getLock("productLock");
lock.lock();
try {
    // 更新数据库
    db.update(product);
    // 删除缓存
    cache.remove(product.getId());
} finally {
    lock.unlock();
}

2. 读写锁(RReadWriteLock)

支持多读单写,适合读多写少的场景,提升并发性能。

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

3. 原子操作(基于 Lua 脚本)

Redisson 使用 Lua 脚本保证多个 Redis 命令的原子性执行,避免中间状态被其他客户端干扰。

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 提供分布式事务机制,支持多个操作的原子提交或回滚。

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

5. 主从强一致性读(getAndSet 等)

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

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

✅ 三、最佳实践建议

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

✅ 总结

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

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录