redis中的高效查找表 - 使用redis集实现?

时间:2011-07-11 18:07:42

标签: database data-structures redis

我想使用redis来存储大量的user_ids以及每个user_ids ids,该用户之前已分配到的“组ID”:

User_ID | Group_ID
   1043 | 2 
   2403 | 1

user_ids的数量相当大(约1000万);独特的数量 group id约为3 - 5.

我对这个LuT的目的是例程:

  • 查找给定用户的组ID ;以及

  • 返回其他用户(指定长度)的列表 组ID为给定用户

在redis中或者至少以最有效的方式执行此操作可能有惯用的方法。如果是这样我想知道它是什么。这是我的工作实现的简化版本(使用python客户端):

# assume a redis server is already running 
# create some model data:
import numpy as NP
NUM_REG_USERS = 100
user_id = NP.random.randint(1000, 9999, NUM_REG_USERS)
cluster_id = NP.random.randint(1, 4, NUM_REG_USERS)
D = zip(cluster_id, user_id)

from redis import Redis
# r = Redis()

# populate the redis LuT:
for t in D :
    r.sadd( t[0], t[1] )

# the queries:
# is user_id 1034 in Group 1?
r.sismember("1", 1034)

# return 10 users in the same Group 1 as user_id 1034:
r.smembers("1")[:10]     # assume user_id 1034 is in group 1

所以我使用普通的redis sets 实现了这个LuT;每个组都键入一个组ID(1,2或3),因此共有三组。

考虑到我想针对它运行的查询类型,这是存储此数据的最有效方法吗?

1 个答案:

答案 0 :(得分:1)

使用集合是一种很好的基本方法,尽管你可能想要改变一些事情:

除非您为每个用户存储组ID,否则您需要5次往返才能获得特定用户的组 - 操作本身为O(1),但您仍需要考虑延迟。通常很容易做到这一点而不需要太多努力 - 您为每个用户存储了许多其他属性,因此为组ID添加一个属性是微不足道的。

你可能想要SRANDMEMBER而不是SMEMBERS - 我认为SMEMBERS每次都会从你的百万件套装中返回相同的10件物品。