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

3
我希望使用redis存储大量的用户ID,并且对于每个ID,还要记录该用户之前所属的“组ID”。
User_ID | Group_ID
   1043 | 2 
   2403 | 1

用户ID的数量相当大(约1000万);唯一组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集合来实现这个LuT;每个集合都是以组ID(1、2或3)为键,总共有三个集合。

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

1个回答

1

使用集合是一个不错的基本方法,但其中有几个地方可能需要更改:

除非你在某处存储了每个用户的组ID,否则你需要进行5次往返以获取特定用户的组 - 操作本身是O(1),但你仍然需要考虑延迟。通常情况下,这很容易做到,不需要太多的努力 - 你为每个用户存储了许多其他属性,因此添加一个组ID属性是微不足道的。

你可能想要使用SRANDMEMBER而不是SMEMBERS - 我认为SMEMBERS会每次返回相同的10个项目,而这些项目来自你的百万项集。


您可以使用管道技术将这5个请求组合起来:http://redis.io/topics/pipelining - Joshua Martell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接