
Redis 集群数据库选择详解
核心结论
Redis 集群只支持使用 db0 数据库,无法像单机 Redis 一样通过 SELECT 命令切换数据库(如 db1-db15)
原因分析
分片机制限制
Redis 集群采用哈希槽分片机制(16384个槽位),数据分布基于 CRC16(key) % 16384。如果允许多个数据库,会导致:
// 错误示例:在集群中切换数据库会报错
JedisCluster jedis = new JedisCluster(nodes);
jedis.select(1); // 抛出异常:ERR SELECT is not allowed in cluster mode
分布式存储特性
- 数据分散在多个节点
- 不同数据库的键可能分布在不同的节点
- 跨节点事务难以保证一致性
数据路由复杂度
多个数据库会增加以下复杂度:
- 键与数据库的映射关系
- 跨数据库的原子操作
- 集群拓扑结构管理
替代方案
业务前缀隔离(推荐)
# 用户数据
SET user:1001:info "{...}"
# 订单数据
SET order:20230803:1001 "{...}"
# 通过scan命令筛选
SCAN 0 MATCH user:* COUNT 100
多集群部署
| 业务类型 | 集群地址 | 数据库 |
|---|---|---|
| 用户服务 | redis-cluster-user:6379 | db0 |
| 订单服务 | redis-cluster-order:6379 | db0 |
命名空间管理
# RedisTemplate 配置示例
spring:
redis:
key-prefix: "PROD:ORDER:" # 生产环境订单业务
注意事项
客户端兼容性
// 正确使用方式:强制使用 db0
JedisClusterConnectionFactory factory = new JedisClusterConnectionFactory();
factory.setDatabase(0); // 显式设置数据库编号
数据迁移策略
从单机迁移到集群时:
- 通过
redis-cli --cluster import命令迁移 - 批量修改键前缀脚本示例:
#!/bin/bash
redis-cli -h old_host -p 6379 --scan --pattern 'db1:*' | while read key
do
new_key="${key/db1:/db0:}" # 替换数据库前缀
redis-cli -h old_host -p 6379 MIGRATE new_host 6379 $key 0 5000 REPLACE KEYS $new_key
done
思维导图
总结
在 Redis 集群中,数据库选择的核心要点是:
- 集群模式强制使用 db0 数据库
- 通过业务前缀实现数据隔离是推荐方案
- 多集群部署适合大型业务场景
- 迁移数据时需要特别注意键前缀处理

1778

被折叠的 条评论
为什么被折叠?



