*Redis CMS.INITBYDIM 命令
CMS.INITBYDIM 使用用户指定的宽度(width)和深度(depth)初始化一个 Count-Min Sketch。
*语法
CMS.INITBYDIM key width depth
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Sketch 的键名 |
| width | Integer | 是 | 每个计数器数组的长度。width 越大,误差越小 |
| depth | Integer | 是 | 计数器数组的数量。depth 越大,误差概率越低 |
*返回值
- OK:初始化成功
- Error:参数错误、键已存在且非 CMS 类型,或内存不足
*时间复杂度
O(1)
*
*示例
*基本初始化
> CMS.INITBYDIM test 2000 5
OK
*大精度 Sketch
> CMS.INITBYDIM large_sketch 10000 10
OK
*检查已存在的键会报错
> CMS.INITBYDIM test 2000 5
(error) ERR key already exists
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数数量不足 | 检查 width 和 depth 是否都已提供 |
| ERR key already exists | key 已存在 | 更换 key 名,或先 DEL 删除旧 key |
| ERR value is not an integer | width 或 depth 不是整数 | 确保传入的是整数 |
| WRONGTYPE | key 已存在但不是 CMS 类型 | 更换 key 名 |
*最佳实践
- width 和 depth 的权衡:width 增大可减小误差,depth 增大可降低误差概率。根据业务精度需求选择
- 初始化前确认 key 不存在,避免覆盖其他数据结构
- 小数据量建议用 CMS.INITBYPROB(按误差概率初始化)更直观
- 生产环境建议设置合理的 width/depth,过大将浪费内存
*FAQ
Q1: CMS.INITBYDIM 和 CMS.INITBYPROB 有什么区别? A: CMS.INITBYDIM 直接指定 width 和 depth 维度;CMS.INITBYPROB 根据目标误差率(error)和概率(probability)自动计算 width 和 depth。
Q2: width 和 depth 推荐值是多少? A: width 建议 2000 以上,depth 建议 5 以上。对于千万级数据,width 可选 10000+,depth 10+。具体取决于可接受的误差范围。
Q3: 初始化后 sketch 占多大内存? A: 内存占用约为 width × depth × 8 字节(每个计数器 64 位)。例如 width=2000, depth=5 约占用 80 KB。