*Redis ZLEXCOUNT 命令
ZLEXCOUNT 返回有序集合中,按字典序介于 min 和 max 范围内的成员数量。要求集合中所有成员的分数相同。
*语法
ZLEXCOUNT key min max
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 有序集合键名 |
| min | String | 是 | 字典序范围最小边界。- 表示负无穷,[ 表示包含,( 表示不包含 |
| max | String | 是 | 字典序范围最大边界。+ 表示正无穷,[ 表示包含,( 表示不包含 |
*返回值
- Integer:范围内的成员数量
- Error:键类型错误、边界格式错误
*时间复杂度
O(log(N)),N 为有序集合的基数。因为底层使用跳跃表范围查询。
*示例
*基本字典序计数
> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
> ZLEXCOUNT myzset [b [d
(integer) 3
*使用开区间
> ZLEXCOUNT myzset (b (d
(integer) 1
*使用无穷边界
> ZLEXCOUNT myzset - +
(integer) 5
> ZLEXCOUNT myzset [c +
(integer) 3
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 不是有序集合 | 检查 key 类型 |
| ERR syntax error | min/max 格式错误 | 必须以 [、(、-、+ 开头 |
*最佳实践
- 场景:字典序索引(用户名前缀统计、标签范围计数)
- 所有成员分数必须相同(通常设为 0),否则结果无意义
- 与 ZRANGEBYLEX 配合使用:先 ZLEXCOUNT 估算数量,再取范围
- 字典序比较是二进制安全的,按字节逐位比较
- 对大量成员进行字典序分页时,用 ZLEXCOUNT 预判结果集大小
*FAQ
Q1: 分数不同时能用 ZLEXCOUNT 吗? A: 语法上可用,但逻辑上无意义。Redis 先按分数排序,同分再按字典序。
Q2: [ 和 ( 的区别是什么?
A: [a 表示包含 "a";(a 表示不包含 "a"。
Q3: ZLEXCOUNT 支持反向范围吗? A: 不支持反向(即 max < min)。如果 max < min 会返回 0。