我有大约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
…
我有两个选项:
- 使用Hash, key是Session:Hist:[account],字段为[session],值为[time]
- 使用哈希平面所有帐户,密钥为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需要在应用程序中进行一些修改,但是通过适当的基准测试(即内存节省),您可以决定是否值得付出努力。