【问题标题】:An Efficient Lookup Table in redis--implemented using redis sets?Redis 中的高效查找表——使用 redis 集实现?
【发布时间】:2011-10-03 00:35:54
【问题描述】:

我想使用 redis 来存储大量的 user_ids 和其中的每一个 ids,该用户之前分配到的“组 id”:

User_ID | Group_ID
   1043 | 2 
   2403 | 1

user_id 的数量相当大(~ 1000 万);唯一的数量 group ids 大约是 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),因此总共有三组。

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

【问题讨论】:

    标签: database data-structures redis


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2012-06-13
    • 1970-01-01
    • 2013-10-14
    • 2014-11-14
    • 2012-06-24
    • 1970-01-01
    • 2015-01-21
    • 2017-01-03
    相关资源
    最近更新 更多