Redis:计算集合中项目出现次数的最佳方法

时间:2014-03-26 12:10:04

标签: python redis

我有一个可以在3K套装上出现的40K物品的清单,我想要计算每件物品有多少套。

Python中的简单算法,为简单起见省略了一些流水线优化:

ids = [1,2,3,4,5]
set1 = (1,3)
set2 = (2,3)
set3 = (4,5)
sets = [set1, set2, set3]

ids_count = {}
for id in ids:
    ids_count[id] = sum([redis.sismember(id, set) for set in sets])

它需要120M redis调用或3K使用流水线操作,两者都非常慢。 有更好的方法可以在不改变数据存储方式的情况下完成(我已经有了id列表和redis上的集合列表)

1 个答案:

答案 0 :(得分:1)

我认为最有效的方法是下载整个事物(所有集合和所有id,无论如何,你最终会做的,正如你所描述的那样),然后在内存中做所有事情。此外,如果没有成员资格检查,您的算法可能会更有效地迭代集合,如下所示:

# ...
for set in sets:
    for id in set:
        if id not in ids_count:
            ids_count[id] = 0
        ids_count[id] += 1

这假设您的表现受网络限制。但你必须对此进行基准测试才能确定。