redis:什么是最快的交叉方式

ren*_*ren 1 redis

我一直在使用sinter来处理无序整数集的交集.有没有更快的交叉方式,因为我不介意事先排序(或执行任何其他预处理)?

编辑: 发现一些信息[这里] [1]

编辑2: 特定答案的赏金:比烧结更快的zinterstore?基准测试也很酷.

mis*_*ion 6

快速回答

在列表中,列表的集合具有复杂度O(N),其中N是最小集合的基数.

使用SET(烧结/SINTERSTORE),如果有数据疏林/应保持RAM低(O(N*M) ),并使用BITSET(SETBIT/BITOP在所有其他情况下()O(N) .就像你编辑一个信息.

BITSET

Redis BIT密钥操作具有复杂度O(N),其中N是最小密钥的基数.并且bitops具有基于CPU缓存的最佳执行速度(查看bitops.c源代码).所以这可能是绝对的赢家,你没有解析数据或者内存对你来说不重要(这里是 Redis中更多的字符串).

ZSET vs SET(zinterstore vs sinter)

不要使用ZSET(zinterstore)你有简单的整数列表,并希望与它们相交.Redis中的排序集是存储密钥ziplistskiplist内部编码的复杂结构 .最后一个用于存储排序分数,但密钥存储在其他结构中.在ZSET交叉点的情况下,比较SET总是很复杂:

ZSET交集:O(N*K)+ O(M*log(M))最坏的情况,N是最小的输入有序集,K是输入有序集的数量,M是结果有序集中的元素数.

SET交集:O(N*M)最坏的情况,其中N是最小集合的基数,M是集合的数量.实际上数学基础理论上是最小的.

SET使用dict/ intsetdata结构来存储数据,在你的情况下(无序整数集)intset将被使用.IntsetRedis中最大的内存保存结构.并且具有最佳的读取速度与ziplist(双链表,更多关于此数据结构内部)的比较.