当前位置: 首页 > ai >正文

Redis集群模式下确保Key在同一Slot的实现方法

核心方法

1. Hash Tag 方法(最常用)

原理:使用 {} 标记关键部分,只有大括号内的内容参与 slot 计算

示例

SET user:{123}:profile "John"
SET user:{123}:settings "premium"
SET order:{123}:pending "true"

规则

  • 只有第一个 {...} 对有效
  • 可以出现在 key 的任何位置
  • 大括号内至少应包含一个字符
  • 无大括号时整个 key 参与计算

最佳实践

  • 选择具有业务意义的标识符作为 hash tag
  • 保持 hash tag 简洁但足够分散

2. 手动计算 Slot(编程实现)

Java 实现

import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.util.JedisClusterCRC16;public class RedisSlotUtils {public static int getSlot(String key) {return JedisClusterCRC16.getSlot(key);}public static boolean isSameSlot(String key1, String key2) {return getSlot(key1) == getSlot(key2);}
}

3. Lua 脚本方法

特性

  • Redis 保证脚本内的所有 key 会在同一节点执行
  • 原子性操作保证

示例脚本

-- 原子性地更新用户数据和计数器
local userKey = KEYS[1]
local counterKey = KEYS[2]
local userData = ARGV[1]
local increment = ARGV[2]redis.call('SET', userKey, userData)
return redis.call('INCRBY', counterKey, increment)

4. 事务处理方法

限制

  • 事务中所有 key 必须属于同一 slot
  • 不支持回滚(遇到错误会继续执行后续命令)

示例

MULTI
SET user:1000:name "Alice"
SET user:1000:last_login "2023-01-01"
EXEC

其他方式

跨 slot 操作的解决方案

  1. 使用 HASH 类型:将相关数据存储在同一个 hash 中

    HMSET user:1000 name "Alice" last_login "2023-01-01" profile "..."
    
  2. 客户端聚合:对于 MGET 等操作,在客户端分组后分别请求

监控与验证工具

  1. 检查 key 所在 slot

    CLUSTER KEYSLOT "your_key"
    
  2. 查看集群 slot 分布

    CLUSTER SLOTS
    
  3. 强制操作特定 slot(高级用法):

    CLUSTER COUNTKEYSINSLOT 1234
    

注意事项与最佳实践

性能考虑

  • 避免热点:不要过度使用单一 hash tag 导致数据倾斜
  • Tag 设计:确保 hash tag 能均匀分布数据
    • 好:{user123}{order456}
    • 不好:{global}{common}

维护建议

  1. 文档记录:明确记录使用的 hash tag 策略
  2. 一致性检查:定期验证关键数据是否位于预期 slot
  3. 迁移准备:设计可迁移的 key 命名方案

异常处理

  • 当出现 CROSSSLOT 错误时,应:
    1. 检查 key 设计是否符合 hash tag 规则
    2. 验证是否意外修改了 hash tag 部分
    3. 考虑使用 Lua 脚本重写相关操作

附录:常用命令参考

命令描述示例
CLUSTER KEYSLOT查看 key 所属 slotCLUSTER KEYSLOT user:1000
CLUSTER SLOTS查看集群 slot 分布CLUSTER SLOTS
CLUSTER COUNTKEYSINSLOT统计 slot 中的 key 数量CLUSTER COUNTKEYSINSLOT 1234

通过合理应用这些方法和最佳实践,可以确保 Redis 集群模式下多 key 操作的正确性和高效性。

http://www.xdnf.cn/news/17035.html

相关文章:

  • 依托CGA匹兹堡睡眠质量指数,优化老年睡眠干预方案​
  • 【面试场景题】日志去重与统计系统设计
  • 复制网页文字到Word、WPS文字?选中后直接拖放
  • PowerShell 入门2: 使用帮助系统
  • Apifox使用mock模仿后端返回数据
  • 基于ZYNQ ARM+FPGA的声呐数据采集系统设计
  • Go语言 定时器
  • 数据结构---Makefile 文件(格式、文件变量、调用、伪目标)、gcc编译的四个步骤、双向链表(概念、作用、应用)
  • Android 之 Kotlin中的kapt
  • 风丘助力混合动力汽车工况测试:精准采集整车信号解决方案
  • 【Spring Cloud】-- 注册中心
  • K8S的NetworkPolicy使用教程
  • 【taro react】 ---- useModel 数据双向绑定 hook 实现
  • 12306旅游产品数据抓取:Python+API逆向分析
  • Webpack 5 Module Federation 模块共享最佳实践
  • 【学习笔记】FTP库函数学习
  • 基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真
  • [Linux]学习笔记系列 -- [arm]boot
  • 如何在 FastAPI 中优雅处理后台任务异常并实现智能重试?
  • Anthropic的商业模式与战略
  • 如何基于MQ实现分布式事务
  • 电子电气架构 ---智能电动汽车嵌入式软件开发过程中的block点
  • PostgreSQL——数据类型和运算符
  • 深度残差网络ResNet结构
  • 《Leetcode》-面试题-hot100-子串
  • 【unitrix】 7.1 二进制位加法(bit_add.rs)
  • 规则方法关系抽取-笔记总结
  • 县级融媒体中心备份与恢复策略(精简版3-2-1架构)
  • 文件包含篇
  • 秋招笔记-8.4