我有大约300 k行数据,如这个Session:Hist:account
会议:Hist:100000
会议:Hist:100001
会议:Hist:100002
.
每个都有5-10个孩子的会话时间
b31c2a43-e61b-493a-b8d4-ff0729fe89de:1846971068807
5552daa2-c9f6-4635-8a7c-6f027b4aa1a3:1846971065461
.
我有两个选择:
我的红宝石有一个主人,4-5奴隶,用于存储和推送会话(约300 K *5在2h)每天,并清除在一天结束!
因此,问题是哪些选项对性能更好(更快的同步主从/更小的内存/更快的巨大请求),谢谢您的帮助!
发布于 2022-04-19 15:16:59
比较提到的两个选项,选项2不是最优的。
值得注意的是,小散列(即具有小值的几个元素)在内存中以特殊方式编码,从而使它们具有非常高的内存效率。
更多细节这里。
因此,使用一个带有键Session:Hist
的巨大散列会影响内存消耗。它还会影响集群(切分),因为您将在一个实例上设置一个散列(热点),这样就会受到锤击。
选项1不受上述问题的影响。只要您有许多分布良好的散列(即所有帐户都有相似的会话计数,而少数帐户以大量会话占优势),散列就像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需要在应用程序中进行一些修改,但是使用适当的工作台标记(即节省内存),您可以决定是否值得这样做。
https://stackoverflow.com/questions/71923026
复制相似问题