【发布时间】:2017-12-19 01:47:42
【问题描述】:
根据ZRANGEBYLEX command 的文档部分,有以下信息。如果将键存储在分数为零的有序集中,则可以按字典顺序检索后面的键。 ZRANGEBYLEX 操作复杂度为O(log(N)+M),其中 N 是总元素数,M 是结果集大小。文档有一些关于字符串比较的信息,但没有说明结构,其中元素将被存储。
但是经过一些实验和阅读source code,这可能是 ZRANGEBYLEX 操作具有线性时间搜索,当ziplist 中的每个元素将与请求匹配时。如果是这样,复杂度将比上面描述的更大——大约 O(N),因为ziplist 中的每个元素都将被扫描。
用gdb调试后,genericZrangebylexCommand函数中实现了ZRANGEBYLEX命令是干净的。控制流在eptr = zzlFirstInLexRange(zl,&range); 继续,因此元素检索的主要工作将在zzlFirstInLexRange 函数中执行。所有命名和以下控制流程都认为使用了ziplist 结构,并且与输入操作数的所有比较都是逐个元素按顺序完成的。
在redis store中插入众所周知的keys后通过分析检查内存,ZSET元素似乎真的存储在ziplist - byte-per-byte与gauge的比较确认它。
所以问题 - 文档如何出错并传播对数复杂性出现线性的地方?或者 ZRANGEBYLEX 命令的工作方式可能略有不同?提前致谢。
【问题讨论】:
标签: redis time-complexity