命令 | 风险说明 | 替代方案 |
HGETALL | 一次性返回哈希表所有字段,Key 内字段过多时阻塞严重 | 使用 HSCAN 游标分批遍历 |
SMEMBERS | 一次性返回集合所有成员 | 使用 SSCAN 游标分批遍历 |
ZRANGE | 一次性返回有序集合指定范围的所有成员 | 使用 ZSCAN 游标分批遍历或缩小查询范围 |
LRANGE | 一次性返回列表指定范围的所有元素 | 缩小范围或分页获取 |
SINTER | 多个集合求交集,元素越多耗时越长 | 在业务侧进行交集运算 |
disable-command-list 配置禁用。命令 | 风险说明 | 替代方案 |
KEYS | 遍历所有键匹配模式,阻塞 Redis 服务器 | 使用 SCAN 游标渐进式匹配 |
FLUSHDB | 清空当前数据库所有数据,不可恢复 | 通过 SCAN + DEL 渐进式删除 |
FLUSHALL | 清空实例所有数据库的全部数据,不可恢复 | 通过 SCAN + DEL 渐进式删除 |
SHUTDOWN | 关闭 Redis 服务器,导致服务中断和数据丢失 | 通过控制台管理实例生命周期 |
CONFIG | 修改服务器运行时配置,操作不当可能导致崩溃 | 通过控制台修改实例参数 |
命令 | 风险说明 | 使用建议 |
RANDOMKEY | 随机返回一个键,会阻塞 Redis 服务器 | 仅在测试环境使用 |
INFO | 返回服务器统计信息,执行过程中阻塞其他请求 | 仅在问题排查时短时使用 |
BGREWRITEAOF | 异步重写 AOF 文件,消耗大量系统资源 | 由系统自动触发,避免手动执行 |
BGSAVE | 异步生成 RDB 快照,消耗大量系统资源 | 由系统自动触发,避免手动执行 |
SELECT 命令随时切换。架构 | 使用建议 |
标准版 | 可根据多 DB 进行数据区分,但 Redis 本身基于单线程处理,多 DB 之间的请求会相互影响 |
集群版 | 建议优先使用0号 DB,非 0 DB 不支持扩容 |
SELECT 0,减少非必要的网络交互。方式 | 说明 | 适用场景 |
原生批量命令( MGET/MSET) | 原子操作,服务端一次性执行 | 批量读写同类型的 Key |
Pipeline | 非原子操作,客户端将多条命令打包发送 | 批量执行不同类型的命令 |
MGET key1 key2 key3 ... key1000
# 第一批MGET key1 key2 ... key500# 第二批MGET key501 key502 ... key800
redis.call / redis.pcall 中调用的 Redis 命令,Key 的位置必须来自 KEYS 数组,否则返回错误:-ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array
Lua script attempted to access a non local key in a cluster node
场景 | 使用建议 |
日常运行 | 不建议开启 Monitor |
问题排查 | 可短时开启用于分析命令执行情况,排查完毕后及时关闭 |
风险类型 | 说明 |
数据倾斜(Memory Skew) | 大量使用相同 Hashtag 的键聚集在某一个节点上,导致该节点内存使用率远高于其他节点,可能提前触发内存告警或写满 |
请求倾斜(Hotspot) | 所有针对这些数据的读写请求命中同一个节点,使其成为性能瓶颈,导致延迟增加甚至拖垮整个集群 |
不可扩容性 | 哈希槽的计算依赖固定的 Hashtag,由此引发的倾斜问题无法通过增加集群节点来缓解 |
准则 | 说明 |
最小化与拆分 | 不要为所有关联数据使用一个统一的 Hashtag,应按业务类型或功能模块使用不同的细粒度 Hashtag |
保证均匀分布 | 确保 Hashtag 值在整体上均匀分布,可在原始 ID 后添加后缀进行人工分片 |
仅在必要时使用 | 仅在必须使用事务、Lua 脚本或多键命令时才使用 Hashtag,无关的键不要滥用此特性 |
SET {global}:user:1001 "data1"SET {global}:user:1002 "data2"SET {global}:order:5001 "order_data"
SET {user:1001}:profile "data1"SET {user:1001}:session "session_data"SET {order:5001}:detail "order_data"
限制项 | 说明 |
消息持久化 | Redis 的 Pub/Sub 不持久化消息,消费者离线期间的消息将丢失 |
消息确认 | 不支持消费确认机制(ACK),无法保证消息被可靠消费 |
堆积能力 | List 结构作为队列时,消息堆积会大量占用内存,影响缓存性能 |
消费模型 | 不支持消费者组、消息分区等高级特性 |
文档反馈