
在 Redis 中,Key 名称中包含 {}(大括号)[Redis 的 Hash Tag(哈希标签)机制] 可以提升查询性能,主要是因为 Redis Cluster(集群模式) 的 Key 分片(Hash Slot)机制 会优先使用 {} 内的内容来计算 Key 的哈希槽(Hash Slot),从而优化 Key 的分布和查询效率。
Redis Cluster 将所有的 Key 分布在 16384 个 Hash Slot(哈希槽) 上,每个 Key 会被分配到一个固定的 Slot,然后由对应的 Redis 节点负责存储和查询。
{},Redis 会 只计算 {} 内的内容 的 CRC16,然后取模 16384 得到 Hash Slot:plaintext复制hash_slot = CRC16(key_inside_braces) % 16384{} 能提升查询性能?CROSSSLOT Keys in request don't hash to the same slotuser:1001 和 user:1001:profile)被分配到不同的 Slot,导致无法用 MGET 或 Pipeline 批量查询。{},可以 手动控制 Hash Slot,让相关 Key 落在同一个 Slot,从而支持批量操作:plaintext复制key1: {user:1001}:name key2: {user:1001}:profilekey1 和 key2 的 {user:1001} 部分相同,CRC16 计算相同,Hash Slot 相同,可以一起查询。{} 让它们落在同一个 Slot,减少跨节点查询的开销。hot_key1 和 hot_key2 会落在同一个 Slot,减少网络开销。{} 内容不同,但 CRC16 计算后落在同一个 Slot,可能会导致 Hash 冲突(虽然概率很低)。假设我们存储用户数据:
user:1001:name
user:1001:profile
user:1001:orders{}:user:1001:name 和 user:1001:profile 可能落在不同的 Slot,无法用 MGET 批量查询。{}:plaintext复制{user:1001}:name {user:1001}:profile {user:1001}:orders{user:1001} 部分相同,Hash Slot 相同,可以一起查询:bash复制MGET {user:1001}:name {user:1001}:profile {user:1001}:orders例如如下的例子:
set {user:1001}:name zhangsan
set {user:1001}:profile '{"age":22,"sex":"M"}'
set user:1002:name zhangsan
set user:1002:profile '{"age":22,"sex":"M"}'
mget {user:1001}:name {user:1001}:profile
mget user:1002:name user:1002:profile mget查询如下图:

假设我们缓存商品数据:
product:1001:info
product:1001:price
product:1001:stock{}:product:1001:info 和 product:1001:price 可能落在不同的 Slot,无法批量查询。{}:plaintext复制{product:1001}:info {product:1001}:price {product:1001}:stock
{product:1001} 部分相同,Hash Slot 相同,可以一起查询:bash复制MGET {product:1001}:info {product:1001}:price {product:1001}:stock1 {} 内的内容越短越好
2 {} 不是必须的
3 {} 不能滥用
情况 | 是否使用 {} | Hash Slot 计算方式 | 是否支持批量查询 | 适用场景 |
|---|---|---|---|---|
单机 Redis | 不需要 | 整个 Key 计算 | 支持 | 无 Cluster 环境 |
Redis Cluster | 不使用 | 整个 Key 计算 | 可能不支持(跨 Slot) | Key 分布随机 |
Redis Cluster | 使用 {} | 只计算 {} 内内容 | 支持(同 Slot) | 需要批量查询或优化热点 Key |
结论:
{} 可以让相关 Key 落在同一个 Hash Slot,从而支持批量查询(如 MGET、Pipeline),提升查询性能。{},因为没有 Cluster 的 Slot 限制。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。