使用 Redis 哈希与许多键的性能比较

War*_*pes 3 database caching redis

好的,我目前正计划使用 Redis 作为我的 NoSQL 数据库的前端缓存。我将在 Redis 数据库中存储很多经常使用的用户数据。我想知道是否key-value为每个用户创建一个条目会更好,或者使用Redis hash字段所在的位置user id和值是一个大的json object。你认为什么会更好?

我看到这篇文章是为了回答这个问题,但它没有讨论值大小的限制。

Ers*_*soy 5

根据用例的不同,选择hashoverstring有很多好处和一些缺点。如果您要选择散列,最好将您的 json 对象设计为散列字段和值,例如;

127.0.0.1:6379> hset user:1 ssn 10101010101 name john surname wick date 2020-02-02 location continental
(integer) 5
127.0.0.1:6379> hgetall user:1
 1) "ssn"
 2) "10101010101"
 3) "name"
 4) "john"
 5) "surname"
 6) "wick"
 7) "date"
 8) "2020-02-02"
 9) "location"
10) "continental"
Run Code Online (Sandbox Code Playgroud)

hash当您进行适当的数据建模时,以下是过度字符串的好处。

  • 在性能方面,大多数字符串和哈希命令都具有相同的复杂性。
  • 与字符串相比,更容易访问/更新/删除散列上的单个 json 字段。您不必获取整个字符串、解码、进行更改并重新设置。您可以使用HDELHSETHGET这些行动没有得到整个对象。
  • 如果您的字符串对象的大小增加,您将在传输(获取/设置)整个对象时受到网络和带宽的影响。正如文档中所述

RAM 速度和内存带宽对于全局性能似乎不太重要,尤其是对于小对象。对于大对象(> 10 KB),它可能会变得很明显。

  • 如果您为设计数据大小制定了良好的基准,则哈希比字符串对内存更友好。正如instagram 工程文档和示例用例中所述,您可能会从特殊编码中获得巨大好处。

散列、列表、仅由整数组成的集合和排序集合,当小于给定的元素数量且达到最大元素大小时,以非常高效的方式进行编码,使用最多 10 倍的内存(5使用的时间更少的内存是平均节省)。

另一方面,取决于您的用例;

  • ziplist 不是免费的,它是内存和 CPU 之间的权衡。
  • 您不能部分过期哈希字段。如果您分成多个字符串,那么您可以使用EXPIRE它们,但在散列中,只有顶级键可以与所有值一起过期。

  • 哇..非常感谢您发送 Instagram 工程链接并进一步解释了优点和缺点。我最终很可能会使用哈希系统。 (2认同)
  • @Ersoy 很好的答案 (2认同)