*Redis XCFGSET 命令
XCFGSET 用于为 Stream 配置 IDMP(Idempotent Message Processing,幂等消息处理)参数,控制幂等 ID 的保留时长和容量上限。
*语法
XCFGSET key [IDMP-DURATION idmp-duration] [IDMP-MAXSIZE idmp-maxsize]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Stream 键名(必须已存在) |
| IDMP-DURATION | Integer | 否 | 幂等 ID 保留时长(秒),范围 1~86400,默认 100 |
| IDMP-MAXSIZE | Integer | 否 | 每个生产者保留的最大幂等 ID 数,范围 1~10000,默认 100 |
*返回值
- OK:配置成功
- Error:参数非法、key 不存在、类型错误等
*时间复杂度
O(1)
*
*示例
*设置保留时长
> XADD mystream * field value
"1638125000000-0"
> XCFGSET mystream IDMP-DURATION 300
OK
*设置最大容量
> XCFGSET mystream IDMP-MAXSIZE 1000
OK
*同时设置两项
> XCFGSET mystream IDMP-DURATION 600 IDMP-MAXSIZE 500
OK
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR no such key | Stream 不存在 | 先使用 XADD 创建 Stream |
| WRONGTYPE | key 不是 Stream 类型 | 确认 key 的数据类型 |
| ERR invalid duration | 时长超出 1~86400 | 调整参数到合法范围 |
| ERR invalid maxsize | 容量超出 1~10000 | 调整参数到合法范围 |
| ERR syntax error | 语法错误或缺少参数 | 检查命令格式 |
*最佳实践
- 在启用 IDMP 的 Stream 上,先调用 XCFGSET 再发送消息
- 根据业务幂等窗口合理设置
IDMP-DURATION,建议大于消费端的最大重试间隔 IDMP-MAXSIZE按生产者数量预估,避免频繁淘汰导致幂等失效- 调用 XCFGSET 会清空该 Stream 已有的 IDMP 映射,生产环境谨慎使用
- 配合 XADD 的 IDMP 选项(
XADD key IDMP pid iid ...)实现端到端幂等
*FAQ
Q1: IDMP 是什么? A: IDMP(Idempotent Message Processing)是 Redis Stream 的幂等消息处理机制。生产者为每条消息附加唯一的幂等 ID(pid + iid),Redis 自动去重,防止消息重复处理。
Q2: 为什么 XCFGSET 会清空已有 IDMP 映射? A: 这是一个重置操作,用于重新初始化 IDMP 配置。生产环境应在低峰期执行,避免影响去重效果。
Q3: 不使用 XCFGSET 能用 IDMP 吗? A: 可以,未配置时使用默认值(DURATION=100s,MAXSIZE=100)。但建议根据业务需求显式配置。