【问题标题】:redis structure, performanceredis结构、性能
【发布时间】:2011-04-17 21:50:32
【问题描述】:

我是 redis 的新手,我有一个包含数百万个成员 ID、电子邮件和用户名的数据集,并且正在考虑将它们存储在例如列表结构中。我认为listsorted set 可能最适合我的情况。

现在,我正在使用用户名的第一个字母来索引列表并将数据推送到后面的列表:rpush list:name:a username,member_id。但是,由于列表没有排序,在几百万条记录中检索某条记录会很慢吗?

在这种情况下,排序集(因为它是排序的)会比列表更好吗?或者,您还有其他提高性能的建议吗?

访问记录的关键应该是用户名和电子邮件。

【问题讨论】:

    标签: redis


    【解决方案1】:

    通过任何不在前端或后端附近的索引访问列表将是昂贵的,花费 O(N)。对于大型列表,这不是很有效。

    使用哈希可能更适合您的需求。这将使用比列表更多的内存,但将提供接近 O(1) 的访问。

    redis 中的哈希是一个命名键,可以包含任意字段和值。

    您可以将整个用户记录存储在使用 member_id 命名的单个 redis 哈希中(希望这是一个短值)。如果保证每个用户的 member_id 是唯一的,这里是如何使用 member_id 42 为用户填充哈希。

    hset user:42 email foo@example.com
    hset user:42 username foobar
    hset user:42 logincount 0
    

    这里的redis“键名”是“user:42”。每个用户将获得一个键,类似于 SQL 数据库中的单行,但更灵活。然后,您可以更新两个辅助哈希:一个将用户名映射到 member_id,另一个将电子邮件地址映射到 member_id。这假设您在 member_id、用户名和电子邮件地址之间具有 1:1 的关系。

    hset username_to_id foobar 42
    hset email_to_id foo@example.com 42
    

    当您需要查找特定用户的电子邮件地址时,您首先从 email_to_id 哈希中查找 member_id,然后从关键用户的哈希中检索 email 字段:member_id em> 同样,你可以从一个用户名开始,在username_to_id hash 中查找member_id,然后得到user:member_id hash 中存储的用户记录。

    以下是在给定电子邮件地址的情况下查找用户名的示例:

    redis> hget email_to_id foo@example.com
    "42"
    redis> hget user:42 username
    "foobar"
    redis> 
    

    您可以通过向“user:”哈希添加更多字段来向用户添加更多记录。如果你想增加一个登录计数器,这也很简单:

    redis> hincrby user:42 login_count 1
    (integer) 1
    redis> hgetall user:42
    1. "email"
    2. "foo@example.com"
    3. "username"
    4. "foobar"
    5. "login_count"
    6. "1"
    redis> 
    

    你可以在 redis.io 网站上找到more information about hashes

    【讨论】:

    • 但是如果 1 m 的用户意味着 1 m 的哈希 id,当你变得特别时,它会降低性能
    猜你喜欢
    • 2020-09-16
    • 2016-12-20
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多