在许多Redis教程(如本教程)中,数据存储在一个集合中,但是多个值组合在一起组成一个字符串(即,一个用户帐户可能作为两个条目存储在集合中,“ user:1000:username”和“用户:1000:密码”)。
但是,Redis也有哈希值。似乎更有意义的是使用“ user:1000”散列,其中包含“ username”条目和“ password”条目。无需将字符串串联以访问特定值,您只需直接在哈希中访问它们即可。
那么,为什么不使用它呢?这些只是旧教程吗?还是Redis哈希有性能问题?
在许多Redis教程(如本教程)中,数据存储在一个集合中,但是多个值组合在一起组成一个字符串(即,一个用户帐户可能作为两个条目存储在集合中,“ user:1000:username”和“用户:1000:密码”)。
但是,Redis也有哈希值。似乎更有意义的是使用“ user:1000”散列,其中包含“ username”条目和“ password”条目。无需将字符串串联以访问特定值,您只需直接在哈希中访问它们即可。
那么,为什么不使用它呢?这些只是旧教程吗?还是Redis哈希有性能问题?
Answers:
像您在问题中建议的那样,Redis散列非常适合存储更复杂的数据。我正是使用它们来存储具有多个需要缓存的属性的对象(具体来说,是电子商务网站上特定产品的库存数据)。当然,我可以使用串联的字符串-但这会给客户端代码增加不必要的复杂性,并且无法更新单个字段。
您可能是正确的-这些教程可能只是在引入哈希之前。它们显然是为存储对象表示而设计的:http : //oldblog.antirez.com/post/redis-weekly-update-1.html
我想一个问题是,与简单的String SET命令相比,插入新项时Redis必须服务的命令数量(n个命令,其中n是哈希中的字段数)。我还没有发现这对Redis每天服务约一百万次的服务来说是一个问题。对我而言,使用正确的数据结构比对性能的影响微不足道。
(另外,请参阅我关于Redis Sets与Redis Strings的评论-我认为您的问题是针对Strings的,但是如果我错了,请更正我!)
哈希是在Redis中存储数据的最有效方法之一,甚至在有效的情况下甚至建议使用它们。
http://redis.io/topics/memory-optimization
尽可能使用哈希
小哈希被编码在很小的空间中,因此您应尽可能使用哈希表示数据。例如,如果您在Web应用程序中具有代表用户的对象,而不是对名称,姓氏,电子邮件,密码使用不同的键,请对所有必填字段使用单个哈希。
用例比较:
集合提供了语义接口,可将数据作为集合存储在Redis服务器中。这种数据的用例将更多地用于分析目的,例如,有多少人浏览产品页面以及有多少人最终购买了产品。
哈希提供语义接口以在Redis服务器中存储简单和复杂的数据对象。例如,用户配置文件,产品目录等。
参考:学习Redis