Redis集合 vs 哈希表

98
在许多Redis教程中(例如此处),数据存储在一个集合中,但是多个值被组合成一个字符串(即一个用户帐户可能被存储在集合中作为两个条目:“user:1000:username”和“user:1000:password”)。
然而,Redis也有哈希。似乎更合理的方式是使用“user:1000”哈希,其中包含“用户名”条目和“密码”条目。而不是连接字符串来访问特定的值,在哈希中直接访问它们。
那么为什么没被广泛使用呢?这些只是旧的教程吗?还是Redis哈希存在性能问题?

2
我认为你指的是命令SET,它实际上使用的是字符串数据类型。它只是一个键值对,而不是实际的集合数据类型(它使用SADD来添加到集合)。 - Mike G
1
你说得对,它使用了SET命令。我没有意识到这是一种单独的数据类型,但这很有道理。 - Nairou
我不知道性能差异,并编写了一个小的基准测试 http://github.com/logrusorgru/redisbm 但是不同的哈希参数(例如字段数量)会返回不同的结果。而且set/get并不总是更慢。 - Ivan Black
4个回答

67

Redis哈希适合存储更复杂的数据,就像你在问题中提到的那样。我正是用它们来存储具有多个属性需要缓存的对象(特别是电子商务网站上特定产品的库存数据)。当然,我也可以使用连接字符串-但是这会给客户端代码增加不必要的复杂性,并且不能更新单个字段。

你可能是对的-教程可能只是在Hashes被引入之前编写的。它们显然是为存储对象表示而设计的:http://oldblog.antirez.com/post/redis-weekly-update-1.html

我想一个问题可能是Redis在插入新项目时必须处理的命令数量(n个命令,其中n是Hash中字段的数量)与简单的字符串SET命令相比。但我在每天大约向Redis发出100万次请求的服务上还没有遇到过这个问题。对我而言,使用正确的数据结构比微不足道的性能影响更重要。

(此外,请查看我的评论,了解Redis集合与Redis字符串的区别-我认为你的问题是关于字符串的,但如果我错了请纠正我!)


2
嗨,Mike,有两个问题。首先,每天100万次点击大约是12个请求/秒,使用Redis-benchmark在低端EC2机器上可以看到30K,在高端笔记本电脑上可以看到120K。如果超过每秒12次以上怎么办?您认为如果每秒有几千个SET,与HASH相比,SET是否是更好的选择?第二个问题是关于您所说的“n个命令,其中n是哈希中字段的数量”,如果您需要存储具有两个参数的项目,则将分别存储2次SET以及执行相同操作的哈希表。您确定HASH会像其字段一样多次击中Redis吗?谢谢。 - Maziyar

62

哈希是 Redis 中存储数据的最有效方法之一,Redis 推荐尽可能使用哈希来存储数据。

http://redis.io/topics/memory-optimization

尽可能使用哈希

小型哈希可以用非常小的空间编码,因此您应该尽可能使用哈希来表示您的数据。例如,如果您在 Web 应用程序中有代表用户的对象,则不要为姓名、姓氏、电子邮件、密码使用不同的键,而是使用一个包含所有所需字段的单个哈希。


1
如果您展示一个例子,那将是更好的答案。 - Christian Matthew

2

使用案例比较:

在Redis服务器中,集合为数据存储提供了语义接口。这种类型的数据更多用于分析目的,例如有多少人浏览了产品页面,其中有多少人最终购买了产品。

哈希表在Redis服务器中提供了语义接口,可以存储简单和复杂的数据对象。例如,用户资料,产品目录等。

参考: 学习Redis


0
  • SETS的使用案例

    • 唯一性:

      我们必须强制应用程序确保每个用户名只能由一个人使用。如果有人使用用户名注册,我们首先查找用户名集合

      SISMEMBER setOfUsernames newUsername
      
    • 创建不同记录之间的关系:

      想象一下你的应用程序中有喜欢功能。您可能为每个单独的用户设置一个单独的集合,并存储该用户到目前为止所喜欢的图像的ID。

    • 查找人们喜欢的共同属性

      在约会应用程序中,用户通常选择不同的属性,并将这些属性存储在集合中。为了帮助人们轻松匹配,我们的应用程序可能会检查这些共同属性的交集

      SINTER user#45:likesSet user#34:likesSet
      
    • 当我们有项目列表且顺序无关紧要时

      例如,如果您想限制要访问您的应用程序的API地址或阻止电子邮件向您发送电子邮件,则可以将它们存储在集合中。

  • Hash的使用案例

Redis哈希通常用于存储复杂的数据对象:会话、用户等。哈希更加优化内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接