Redis 多 Key 或多 Hash 字段

Redis multi Key or multi Hash field

我有大约 30 万行这样的数据 Session:Hist:[account]

会话:历史:100000

会话:历史:100001

会话:历史:100002

.......

每人有5-10个孩子[session]:[time]

b31c2a43-e61b-493a-b8d4-ff0729fe89de:1846971068807

5552daa2-c9f6-4635-8a7c-6f027b4aa1a3:1846971065461

.......

我有两个选择:

  1. 使用哈希,键为Session:Hist:[account],字段为[session],值为[时间]
  2. Using Hash flat all account, key is Session:Hist, field is [account]:[session], value is [时间]

我的Redis有1个master,4-5个Slave,每天用于存储和推送session(2小时内约300k *5),一天结束时清除!

所以问题是哪个选项对性能更好(更快的同步 master-slave/smaller memory/faster 对于巨大的请求),感谢您的帮助!

比较提到的两个选项,选项 #2 不太理想。

根据official Redis documentation

It is worth noting that small hashes (i.e., a few elements with small values) are encoded in special way in memory that make them very memory efficient.

更多详情here

因此,拥有一个带有键 Session:Hist 的巨大散列会影响内存消耗。它还会影响集群(分片),因为您将在一个实例上放置一个哈希 (hot-spot),这会受到重创。

选项 #1 没有上述问题。只要您有许多 well-distributed(即所有帐户的会话数都相似,而少数帐户在大量会话中占主导地位)哈希键控为 Session:Hist:[account].

但是,如果帐户中的会话分配可能不均衡,您可以尝试(并衡量)选项 1a 的效率:

  • 键:Session:Hist:[account]:[session - last two characters]
  • 字段:[session's last two characters]
  • 值:[time]

示例:

  • 键:Session:Hist:100000:b31c2a43-e61b-493a-b8d4-ff0729fe89
  • 字段:de
  • 值:1846971068807

这样,每个哈希将只包含 最多 256 个字段(假设会话的最后 2 个字符是十六进制,所有可能的组合都是 256)。如果 redis.conf 定义 hash-max-zipmap-entries 256.

,这将是最佳选择

显然,选项 1a 需要对您的应用程序进行一些修改,但如果 bench-marking(即节省内存),您可以决定是否值得这样做。