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
)键
- 按键本身的内存使用情况稍微好一点
- 这些值在语义上是相关的
- 所有值都在同一个节点上(无论是单服务器还是群集)是可以的
哈希最大zipmap条目
和哈希最大zipmap值
(这意味着哈希将超过这两个值),建议使用哪种方法?或者这两种方式是一样的?非常感谢。我不知道你说的“推荐哪条路”是什么意思。如果您不需要简单值提供的任何特殊内容(过期等),那么您应该使用哈希。您还应该调整hash max-*
值,使其适合您的系统。最好做一些实验和基准测试来找出答案。非常感谢您的回复。关于Marc的答案,如果我使用集群并希望在不同的节点上进行切分,我必须使用字符串而不是哈希。由于这个限制,我想我会选择字符串。非常感谢你的回答。我现在更清楚了。我现在不使用集群,但将来当数据库越来越大时,我肯定需要配置它。这意味着我应该选择字符串而不是散列。(除非我想像这样做预切分HSET object:12 34 somevalue
,我真的不想费心去做)非常感谢!