【问题标题】:Redis HMSET with multiple fields or multiple HMSET for lookups用于查找的具有多个字段或多个 HMSET 的 Redis HMSET
【发布时间】:2019-11-15 11:34:12
【问题描述】:

我是 Redis 新手。我有一个场景,我需要将数百万个项目放在 Redis 缓存中以供以后查找。每个条目也需要过期,如果它在一段时间内没有使用。

一种方法是,一个带有字段和值的 HMSET,另一个 HMSET 来跟踪到期时间(大量的簿记)

第二个选项是为每个条目设置 HMSET,并为其设置到期时间。 (我猜很简单)。

我的问题,Redis 是否设计有数百万个 HMSET ?随着越来越多的 HMSET 被引入缓存的每个条目,它会降低 Redis 的性能吗? 一个后续问题。如果我要使用字符串数据类型,是否同样适用?

【问题讨论】:

  • 这取决于您要如何检索它们。如果将 HGET 用于单个字段,则为 O(1),但 HMGET 为 O(N)。同样,单个字符串项的 GET 是 O(1),但 MGET 是 O(N):基本规则是您想要返回的数据越多,所需的时间就越长。这里似乎最简单的方法是在插入项目时设置 TTL,以便它们在某个时候自动过期,并在 GET 时重置 TTL,以便它们保持活动状态。
  • @howcheng 我想你误解了 HMGET 文档中清楚地写着 O(n) 是针对 n 个请求的字段,所以访问一个字段是 O(1)。这同样适用于 MGET。我的问题是澄清我是否需要将每个条目作为独立的(有点分散)或在一个地方进行簿记。阅读所有文档以了解 Redis 的内部工作原理需要花费太多时间。询问已经使用它或有机会理解它的其他人很容易。
  • 是的,一个字段的HMGET与HGET相同。我没有误会;我只是假设如果您使用的是 HMGET/SET,那么您打算同时处理多个字段(因为这是这些命令的目的),

标签: .net-core redis stackexchange.redis


【解决方案1】:
  • 使用哈希更节省内存:https://redis.io/topics/memory-optimization
  • 内存节省因hash-max-zipmap-entrieshash-max-zipmap-value 的设置而异
  • 使用散列不允许您使键的单个字段过期,并且像您设置的那样,您需要另一个散列来记账。你可以编写 Lua 脚本来插入数据和记账 ttl 数据;节省一些往返时间。
  • 拥有数百万个哈希就可以了
  • 如果您觉得哈希太大,您可以随时对其进行分块。例如,以1000id 模数,例如id 0,等等....这样你最终会得到更少的散列

【讨论】:

  • 拥有数以百万计的哈希值很好您能否给我一个参考资料,以了解它的来源。我问它是因为我正在编写一项服务,我不希望它投入生产,我做出的技术决策成为瓶颈。
  • 来自 redis 常见问题本身 redis.io/topics/faq 。就个人而言,我已经部署了许多小型服务,redis 已经拥有超过 100 万个密钥,这从来都不是问题。
  • 感谢您的参考。我很感激你的时间。它确实回答了我的问题。
猜你喜欢
  • 2017-06-05
  • 2015-12-18
  • 2018-01-09
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2017-12-04
相关资源
最近更新 更多