String vs Hash是否为字符串类型?哈希只有一个密钥而不是多个密钥

问题描述 投票:2回答:2

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

> 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。这意味着哈希最终会超过这两个值。在这样的配置中,两种方式是一样的吗?或推荐哪种方式?

redis
2个回答
3
投票

使用字符串的原因:

  • 你需要每个值超时
  • 这些值在语义上是孤立的
  • 你在群集上并希望在不同节点上分割值以分散负载(分片基于密钥)

使用哈希的原因:

  • 您希望能够立即清除所有这些(del / unlink),或者具有一次性影响所有这些值的超时
  • 你希望能够枚举它们(更喜欢hscan / hgetall而不是scan / keys
  • 键本身的内存使用量稍微好一些
  • 这些值在语义上是相关的
  • 可以将所有值放在同一节点上(无论是单服务器还是集群)

2
投票

这一切都取决于您想要支持的权衡。通常,使用散列比使用简单键具有更小的内存占用。事实上,它的内存大约减少了一个数量级。并且访问哈希值是恒定时间。因此,如果您将redis简单地用作键值存储,那么哈希比简单键更有效。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.