字符串vs哈希为字符串类型?哈希将只有一个密钥,而不是许多密钥

时间:2019-03-17 09:16:22

标签: redis

例如,我看到许多人正在做以下事情:

> set data:1000 "some string 1"
> set data:1001 "some string 2"

但是使用散列来最大程度地减少键的数量呢?

> hset data 1000 "some string 1"
> hset data 1001 "some string 2"

第二种方式,它将仅创建一个data键,而不是第一种方式创建许多键。

推荐哪种方式?

我刚刚看到有人和教程在做hset data:10 01 xxx。这实际上与我的问题无关。我的问题只是询问在set data:1001 xxxhset data 1001 xxx之间的建议。

我不打算修改hash-max-zipmap-entrieshash-max-zipmap-value。这意味着哈希值最终将超过两个值。在这样的配置中,两种方式是否相同?或推荐哪种方式?

2 个答案:

答案 0 :(得分:3)

使用字符串的原因:

  • 您需要按值超时
  • 这些值在语义上是孤立的
  • 您在集群上,希望将值分片到不同的节点上以分散负载(分片基于密钥)

使用哈希的原因:

  • 您希望能够一次清除所有这些值(del / unlink),或者有一个超时时间会立即影响所有这些值
  • 您希望能够枚举它们(比起hscan / hgetall,更喜欢scan / keys
  • 按键本身的内存使用情况略好
  • 这些值在语义上相关
  • 可以将所有值都放在同一节点(单服务器或群集)上

答案 1 :(得分:2)

这全部取决于您要支持的权衡。通常,与使用简单键相比,使用哈希将占用较小的内存。实际上,它的内存大约减少了一个数量级。访问哈希值是固定时间。因此,如果您只是将redis用作键值存储,则哈希比简单键更有效。

但是,如果您需要支持到期,键空间通知等,则需要使用简单键。

请注意在redis.conf中调整hash-max-zipmap-entrieshash-max-zipmap-value的值,以确保针对您的环境正确处理散列。

您可以在memory optimization section of the documentation中阅读所有详细信息。