redis结构,性能

Leo*_*eon 7 redis

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

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

在这种情况下,排序集(因为它已排序)是否优于列表?或者,您是否有其他建议可以提高性能?

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

小智 14

通过不靠近前端或末端的任何索引访问列表将是昂贵的,花费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
Run Code Online (Sandbox Code Playgroud)

这里的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
Run Code Online (Sandbox Code Playgroud)

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

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

redis> hget email_to_id foo@example.com
"42"
redis> hget user:42 username
"foobar"
redis> 
Run Code Online (Sandbox Code Playgroud)

您可以通过向"用户"添加更多字段来向用户添加更多记录:"hash.如果你想增加一个登录计数器,那也很简单:

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> 
Run Code Online (Sandbox Code Playgroud)

您可以在redis.io站点上找到有关哈希的更多信息.