- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
根据 ZRANGEBYLEX command 的文档部分, 有以下信息。如果将键存储在零分的有序集中,则可以按字典顺序检索后面的键。 ZRANGEBYLEX 操作复杂度为 O(log(N)+M)
,其中 N 是元素总数,M 是结果集大小。文档有一些关于字符串比较的信息,但没有说明将存储元素的结构。
但经过一些实验和阅读之后source code ,这可能是 ZRANGEBYLEX 操作具有线性时间搜索的原因,此时 ziplist
中的每个元素都将与请求匹配。如果是这样,复杂度将比上面描述的更大——大约 O(N),因为 ziplist
中的每个元素都将被扫描。
用gdb调试后,很明显ZRANGEBYLEX命令在genericZrangebylexCommand中实现了功能。控制流在 eptr = zzlFirstInLexRange(zl,&range);
处继续,因此元素检索的主要工作将在 zzlFirstInLexRange 处执行。功能。所有命名和后续控制流都考虑使用ziplist
结构,所有与输入操作数的比较都是逐个元素顺序进行的。
在 redis 存储中插入众所周知的键后通过分析检查内存,似乎 ZSET 元素确实存储在 ziplist
中 - 与 gauge 逐字节比较确认一下。
那么问题 - 文档怎么会出错并在出现线性复杂度的地方传播对数复杂度?或者 ZRANGEBYLEX 命令的工作方式略有不同?提前致谢。
最佳答案
how can documentation be wrong and propagate logarithmic complexity where linear one appears?
该文档多次出错,但这是一项持续的开源工作,您可以通过存储库 (https://github.com/antirez/redis-doc) 为之做出贡献。
Or maybe ZRANGEBYLEX command works slightly different?
从某种意义上说,您的结论是正确的,因为当使用 Ziplist 对其进行编码时,排序集搜索操作(无论是否按字典顺序)都表现出线性时间复杂度。
但是。
Ziplists 是一种更喜欢 CPU 而不是内存的优化,这意味着它适用于小集合(即低 N 值)。它通过配置进行控制(参见 zset-max-ziplist-entries
和 zset-max-ziplist-value
指令),一旦数据增长超过指定阈值ziplist 编码转换为 skip list .
因为 ziplist 很小(小 N),它们的复杂度可以假设为常数,即 O(1)。另一方面,由于它们的性质,跳跃列表表现出对数搜索时间。 IMO 这意味着文档的完整性保持不变,因为它提供了最坏情况下的复杂性。
关于Redis ZRANGEBYLEX 命令复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47871402/
我创建了这样的集合ZADD myzset 0 baba 0 abab 0 aabb 0 bbaa 0 baab 0 abba 当我使用“aa”和“bb”关键字进行查询时,结果如下 对于“aa” ZRA
如何查询我的排序集以获取包含某些字符的所有键? “开始于”工作正常,但我需要“包含”。我正在使用下面的查询“开始于”,效果很好 zrangebylex zset [2110 "[2110\xff" L
我有一个存储在 redis 中的集合,如下所示: 127.0.0.1:6379> zrange my_set 0 -1 1) "ABC20180108131627044829:XYZ201801081
根据 ZRANGEBYLEX command 的文档部分, 有以下信息。如果将键存储在零分的有序集中,则可以按字典顺序检索后面的键。 ZRANGEBYLEX 操作复杂度为 O(log(N)+M),其中
我想使用redis的python客户端执行如下命令 zrangebylex names_sorted_set [a "[a\xff\xff\xff\xff" 但在我的代码中会发生以下情况 na
要跟进这篇文章:redis store 128 bit number 如何使用 ipv6 地址进行字典搜索。 如果我这样使用它: ZADD index 0 8000::/24 ZADD index 0
在我的排序集中,几乎没有这样的项目: > zrangebylex search - + 1) "abcdefghijkl" 2) "[asd](asd)" 3) "[zxy](zxc)" 如何仅使用前
我使用的是 c# 4.5,StackExchange.Redis 版本为 1.0.316.0。我需要向 reids 服务器发送以下命令以搜索我所有以 aar 开头的排序集。 ZRANGEBYLEX I
Redis 命令 ZRANGEBYLEX 返回元素的顺序是什么?还是没有定义? 最佳答案 顾名思义,它是按字典顺序排列的。 例子: 127.0.0.1:6379> zadd test 0 a 1 b
我正在尝试制作一个简单的自动完成系统,就像这里的演示一样:http://autocomplete.redis.io/但出于某种原因,我无法让 ZRANGEBYLEX 返回正确的结果。这是我在 Redi
特别是,我需要知道: Range 的 gt、gte、lt 和 lte 方法如何工作。 有没有办法只查看一个项目?对于前。从命令行可以做到: zadd test 0 aaaa (integer) 1 z
在 REDIS CLI 中执行时,下面的命令返回预期结果(地名带有前缀“new alban”)。 127.0.0.1:6379> zrangebylex my_places_data_set “[新阿
已解决。解决方案如下,感谢@hobbs,我更正了它。 我正在使用 node_redis包。 下面是我如何通过 cli 使用 ZRANGEBYLEX 命令。 127.0.0.1:6379> zadd m
我是一名优秀的程序员,十分优秀!