目录
一、键值设计规范(避免性能陷阱)
1. Key 命名规范
2. Value 设计禁忌
二、命令使用规范(规避性能风险)
1. 高危命令禁用
2. 高效命令实践
三、数据生命周期管理
1. TTL 最佳实践
2. 内存优化方案
四、集群与高可用规范
1. 部署架构选择
2. 集群使用禁忌
五、安全与监控规范
1. 安全基线
2. 监控关键指标
六、客户端使用规范
1. 连接池配置(Java示例)
2. 重试与熔断机制
七、典型踩坑案例与解决方案
八、总结:Redis规范核心原则
一、键值设计规范(避免性能陷阱)
1. Key 命名规范
规则 | 示例 | 理由 |
---|---|---|
业务前缀 + 冒号分隔 | order:1001 | 清晰分类,方便管理 |
禁止超长Key(≤128字符) | ❌ product:2023:details:... | 内存浪费,查询效率低 |
禁用特殊字符 | ❌ 反例:包含空格、换行、单双引号以及其他转义字符 | 易引发编码问题 |
2. Value 设计禁忌
问题类型 | 错误案例 | 正确方案 |
---|---|---|
大Key问题 | 10MB的JSON字符串 | 拆分Hash结构或压缩(Snappy) string 类型控制在 10KB 以内, hash 、 list 、 set 、 zset 元素个数不要超过 5000 |
热Key集中 | 全局配置Key sys:config | 按业务拆分为多个子Key |
无效数据 | 缓存永不清理的历史数据 | 设置TTL过期时间 |
大key避免阻塞删除 | del 大key,会阻塞删除 | 使用 hscan 、 sscan 、 zscan 方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题 ( 例如一个 200 万的 zset 设置 1 小时过期,会触发 del 操作,造成阻塞,而且该操作不会不出现在慢查询中(latency 可查 )) |
大Key诊断命令:
redis-cli --bigkeys # 扫描大Key
redis-memory-for-key user:1001 # 查看Key内存
异步删除命令:
1> Hash删除:hscan+hdel
2> List删除:ltrim
3> Set删除:sscan+srem
4> SortedSet删除:zscan+zrem
二、命令使用规范(规避性能风险)
1. 高危命令禁用
命令 | 风险 | 替代方案 |
---|---|---|
KEYS * | 阻塞Redis(单线程) | SCAN 分批次迭代 |
FLUSHALL | 误删全库数据 | 物理隔离测试环境 |
MONITOR | 生产环境性能腰斩 | 仅调试时短时使用 |
2. 高效命令实践
场景 | 低效命令 | 高效命令 |
---|---|---|
批量写入 | 循环调用 SET | MSET 或 Pipeline |
统计数量 | HGETALL + 客户端计数 | HLEN |
集合运算 | 客户端求交集 | SINTERSTORE 服务端计算 |
Pipeline 示例:
pipe = redis.pipeline()
for user_id in user_ids:pipe.hgetall(f"user:{user_id}")
results = pipe.execute() # 一次网络往返
三、数据生命周期管理
1. TTL 最佳实践
策略 | 说明 |
---|---|
所有缓存Key必须设置TTL | 防止数据永久堆积(包括持久化场景) |
过期时间随机离散化 | TTL = base_time + random(0, 300) |
异步延迟删除 | 配置 lazyfree-lazy-expire yes 减少阻塞 |
2. 内存优化方案
数据类型 | 优化手段 |
---|---|
String | ≤10KB直接存,大文本压缩 |
Hash | 字段数 ≤1000,否则拆分子Hash |
List | 列表长度 ≤5000,否则分片存储 |
四、集群与高可用规范
1. 部署架构选择
业务规模 | 推荐架构 | 说明 |
---|---|---|
<10GB数据 | Redis Sentinel | 主从+哨兵,简单可靠 |
>50GB数据 | Redis Cluster | 分片存储,支持水平扩展 |
跨地域容灾 | 多活集群(如CRDT) | 如阿里云全球多活 |
2. 集群使用禁忌
行为 | 风险 |
---|---|
未预分片直接扩容 | 数据迁移导致性能抖动 |
使用事务跨多个Key | Cluster模式仅支持同Slot事务 |
单分片热点Key超过承载能力 | 分片不均引发性能瓶颈 |
分片均匀性检查:
redis-cli cluster nodes | grep master | awk '{print $8}' | sort | uniq -c
五、安全与监控规范
1. 安全基线
措施 | 操作指引 |
---|---|
禁用默认端口6379 | 修改为非常用端口(如 16379) |
启用ACL访问控制 | redis6.0+ 使用 ACL SETUSER |
网络隔离 | Redis绑定内网IP,拒绝公网访问 |
2. 监控关键指标
指标 | 报警阈值 | 工具 |
---|---|---|
内存使用率 | >80% | Prometheus + Grafana |
连接数 | >5000 | Redis Exporter |
每秒淘汰Key数 | 持续 >100 | 监控慢查询日志 |
主从延迟 | >10秒 | info replication |
六、客户端使用规范
1. 连接池配置(Java示例)
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100); // 最大连接数(建议≤500)
config.setMaxIdle(30); // 最大空闲连接
config.setMinIdle(10); // 最小空闲连接(防突发流量)
config.setTestOnBorrow(true); // 取连接时校验
2. 重试与熔断机制
# Spring Cloud CircuitBreaker配置
resilience4j.circuitbreaker:instances:redis:failureRateThreshold: 50% # 错误率阈值waitDurationInOpenState: 10sslidingWindowSize: 100 # 基于最近100次请求
七、典型踩坑案例与解决方案
案例1:大Key导致集群扩容失败
-
现象:迁移1GB的Hash Key时网络超时
-
解决:
-
拆分为100个小Key:
user:1001:subkey_{01..99}
-
分批迁移 + 增量同步
-
案例2:阻塞命令引发服务雪崩
-
现象:运维执行
KEYS *
导致所有请求超时 -
解决:
-
禁用高危命令:
rename-command KEYS ""
-
使用代理层拦截(如阿里云Redis企业版)
-
八、总结:Redis规范核心原则
键值设计三原则
-
小Key:Value ≤ 10KB
-
短Key:命名可读且精简
-
散TTL:过期时间随机化
命令使用四不要
-
不要阻塞命令(KEYS/MONITOR)
-
不要事务滥用
-
不要循环查询
-
不做危险操作(FLUSHALL)
集群运维两必须
-
必须监控内存/连接数
-
必须做容灾演练
安全防护三基线
-
网络隔离
-
权限最小化
-
日志审计
终极建议:每次写入Redis前问自己:
这个Key需要设置TTL吗?
Value是否超过10KB?
是否可能成为热Key?
是否有被攻击的风险?