草庐IT

database - An Efficient Lookup Table in redis--使用redis sets实现?

coder 2023-07-18 原文

我想使用 redis 来存储大量的 user_ids 以及其中的每一个 ids,该用户先前分配给的“组 ID”:

User_ID | Group_ID
   1043 | 2 
   2403 | 1

user_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 sets 实现了这个 LuT;每组都键入一个组 ID(1、2 或 3),因此总共有三组。

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

最佳答案

使用集合是一种很好的基本方法,尽管其中有几处您可能想要更改:

除非您将每个用户的组 ID 存储在某处,否则您将需要 5 次往返才能为特定用户获取组 - 操作本身是 O(1),但您仍然需要考虑延迟。通常无需太多努力即可轻松完成此操作 - 您为每个用户存储了许多其他属性,因此为组 ID 添加一个是微不足道的。

您可能想要 SRANDMEMBER 而不是 SMEMBERS - 我认为 SMEMBERS 每次都会从您的百万元素集中返回相同的 10 件元素。

关于database - An Efficient Lookup Table in redis--使用redis sets实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6654460/

有关database - An Efficient Lookup Table in redis--使用redis sets实现?的更多相关文章

随机推荐