Redis设置与哈希


75

在许多Redis教程(如教程)中,数据存储在一个集合中,但是多个值组合在一起组成一个字符串(即,一个用户帐户可能作为两个条目存储在集合中,“ user:1000:username”和“用户:1000:密码”)。

但是,Redis也有哈希值。似乎更有意义的是使用“ user:1000”散列,其中包含“ username”条目和“ password”条目。无需将字符串串联以访问特定值,您只需直接在哈希中访问它们即可。

那么,为什么不使用它呢?这些只是旧教程吗?还是Redis哈希有性能问题?


1
我认为您指的是命令SET,它实际上是使用Strings数据类型的。与实际的Sets数据类型(使用SADD添加到集合中)相反,它只是一个键/值对。
Mike G

您是正确的,它正在使用SET命令。我没有意识到这是一个单独的数据类型,但这是有道理的。
奈柔

我不了解性能差异并编写小型基准测试github.com/logrusorgru/redisbm,但是不同的哈希参数(例如字段数)返回不同的结果。设置/获取并不总是较慢。
伊万·布莱克

Answers:


54

像您在问题中建议的那样,Redis散列非常适合存储更复杂的数据。我正是使用它们来存储具有多个需要缓存的属性的对象(具体来说,是电子商务网站上特定产品的库存数据)。当然,我可以使用串联的字符串-但这会给客户端代码增加不必要的复杂性,并且无法更新单个字段。

您可能是正确的-这些教程可能只是在引入哈希之前。它们显然是为存储对象表示而设计的:http : //oldblog.antirez.com/post/redis-weekly-update-1.html

我想一个问题是,与简单的String SET命令相比,插入新项时Redis必须服务的命令数量(n个命令,其中n是哈希中的字段数)。我还没有发现这对Redis每天服务约一百万次的服务来说是一个问题。对我而言,使用正确的数据结构比对性能的影响微不足道。

(另外,请参阅我关于Redis Sets与Redis Strings的评论-我认为您的问题是针对Strings的,但是如果我错了,请更正我!)


1
嗨,迈克,有两个问题。首先,每天一百万次点击的速度约为12 req / s,通过Redis基准测试,您在低端EC2计算机上看到30K,在高端笔记本电脑上看到120K。每秒超过12次如何?您是否认为如果每秒只有几千个SET会比HASH更好的选择?第二个问题是关于您所说的“ n个命令,其中n是哈希中的字段数”,如果您需要存储带有两个参数的项目,则它将是SET的2倍,用于分别存储与哈希相同的内容做同样的事情。您确定HASH击中Redis的次数与它的字段一样多吗?tnx
Maziyar 2013年

48

哈希是在Redis中存储数据的最有效方法之一,甚至在有效的情况下甚至建议使用它们。

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

尽可能使用哈希

小哈希被编码在很小的空间中,因此您应尽可能使用哈希表示数据。例如,如果您在Web应用程序中具有代表用户的对象,而不是对名称,姓氏,电子邮件,密码使用不同的键,请对所有必填字段使用单个哈希。


0

用例比较:

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

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

参考:学习Redis

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.