Redis多Key或多Hash字段



我有大约300k行数据,像这样Session:Hist:[account]

会话:嘘:100000

会话:嘘:100001

会话:嘘:100002

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

b31c2a43 e61b - 493 a - b8d4 ff0729fe89de: 1846971068807

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

我有两个选项:

  1. 使用Hash, key是Session:Hist:[account],字段为[session],值为[time]
  2. 使用哈希平面所有帐户,密钥为Session:Hist,字段为[account]:[session],值为[time]

我的Redis有1个主,4-5个从,用来存储&每天推送会话(2小时约300k *5),并在一天结束时清除!

所以问题是哪个选项更好的性能(更快的同步主从/更小的内存/更快的巨大请求),感谢您的帮助!

比较上述两个选项,选项#2不是最优的。

根据官方Redis文档:

值得注意的是,小哈希值(即一些值较小的元素)在内存中以特殊的方式编码,这使得它们非常节省内存。

更多细节在这里。

所以有一个键为Session:Hist的大哈希会影响内存消耗。它还会影响集群(分片),因为您将在一个实例上有一个散列(热点),该实例将被锤击。

选项#1不会出现上述问题。只要你有许多分布良好的哈希键为Session:Hist:[account](即所有帐户的会话数相似,而少数帐户占主导地位,拥有大量会话)。

但是,如果存在会话不均匀分布到帐户的可能性,您可以尝试(并度量)选项1a的效率:

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

例子:

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

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

显然,选项1a需要在应用程序中进行一些修改,但是通过适当的基准测试(即内存节省),您可以决定是否值得付出努力。

最新更新