我想使用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),因此共有三组。
考虑到我想针对它运行的查询类型,这是存储此数据的最有效方法吗?
答案 0 :(得分:1)
使用集合是一种很好的基本方法,尽管你可能想要改变一些事情:
除非您为每个用户存储组ID,否则您需要5次往返才能获得特定用户的组 - 操作本身为O(1),但您仍需要考虑延迟。通常很容易做到这一点而不需要太多努力 - 您为每个用户存储了许多其他属性,因此为组ID添加一个属性是微不足道的。
你可能想要SRANDMEMBER而不是SMEMBERS - 我认为SMEMBERS每次都会从你的百万件套装中返回相同的10件物品。