Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis 字符串类型的字符串与哈希?哈希将只有一个键,而不是多个键_Redis - Fatal编程技术网

Redis 字符串类型的字符串与哈希?哈希将只有一个键,而不是多个键

Redis 字符串类型的字符串与哈希?哈希将只有一个键,而不是多个键,redis,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" 在第二种方法中,它将只创建一个数据键,而不是在第一种方法中创建多个键 推荐哪种方式 我只是看到一些人和教程正在做hset数据:10 01

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

> set data:1000 "some string 1"
> set data:1001 "some string 2"
但是,使用散列来最小化键的数量怎么样

> hset data 1000 "some string 1"
> hset data 1001 "some string 2"
在第二种方法中,它将只创建一个
数据
键,而不是在第一种方法中创建多个键

推荐哪种方式

我只是看到一些人和教程正在做
hset数据:10 01 xxx
。这其实与我的问题无关。我的问题只是问一下在
set data:1001 xxx
hset data 1001 xxx
之间建议使用什么


我不打算修改
哈希最大zipmap条目
哈希最大zipmap值
。这意味着哈希最终将超过这两个值。在这样的配置中,这两种方式是相同的吗?或者建议采用哪种方式?

这完全取决于您希望支持的权衡。通常,使用散列比使用简单键占用的内存更小。事实上,它大约比内存少一个数量级。访问散列值的时间是常数。所以,如果您只是将redis用作键值存储,那么哈希比简单的键更有效

但是,如果需要支持过期、密钥空间通知等,则需要使用简单密钥

只需小心调整redis.conf中
hash max zipmap条目
hash max zipmap value
的值,以确保针对您的环境正确处理哈希


您可以阅读。

使用字符串的原因:

  • 您需要每值超时
  • 这些值在语义上是隔离的
  • 您在集群上,希望将值分片到不同的节点上以分散负载(分片基于键)
使用哈希的原因:

  • 您希望能够一次清除所有这些值(
    del
    /
    unlink
    ),或者一次有一个影响所有这些值的超时
  • 您希望能够枚举它们(首选
    hscan
    /
    hgetall
    而不是
    scan
    /
  • 按键本身的内存使用情况稍微好一点
  • 这些值在语义上是相关的
  • 所有值都在同一个节点上(无论是单服务器还是群集)是可以的

这个问题太宽泛了,但应该会有帮助。@KevinChristopherHenry谢谢你的评论。我不明白你为什么说这个问题太宽泛了。只是存储一个简单的字符串,有这么宽吗?每个人都需要在密钥中存储一些具有唯一ID的字符串。我只是想知道我应该使用散列还是字符串类型。这就是全部。因为从我的观点来看,哈希更好。只需要一把钥匙。但我看到很多人使用字符串而不是散列,我不明白为什么,我想知道这是否重要,或者只是用户的偏好。干杯,谢谢你的回答。但是,如果我不需要过期、键空间通知,并且不修改
哈希最大zipmap条目
哈希最大zipmap值
(这意味着哈希将超过这两个值),建议使用哪种方法?或者这两种方式是一样的?非常感谢。我不知道你说的“推荐哪条路”是什么意思。如果您不需要简单值提供的任何特殊内容(过期等),那么您应该使用哈希。您还应该调整
hash max-*
值,使其适合您的系统。最好做一些实验和基准测试来找出答案。非常感谢您的回复。关于Marc的答案,如果我使用集群并希望在不同的节点上进行切分,我必须使用字符串而不是哈希。由于这个限制,我想我会选择字符串。非常感谢你的回答。我现在更清楚了。我现在不使用集群,但将来当数据库越来越大时,我肯定需要配置它。这意味着我应该选择字符串而不是散列。(除非我想像这样做预切分
HSET object:12 34 somevalue
,我真的不想费心去做)非常感谢!