*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。