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
.......
我有两个选择:
- 使用哈希,键为Session:Hist:[account],字段为[session],值为[时间]
- 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(即节省内存),您可以决定是否值得这样做。
我有大约 30 万行这样的数据 Session:Hist:[account]
会话:历史:100000
会话:历史:100001
会话:历史:100002
.......
每人有5-10个孩子[session]:[time]
b31c2a43-e61b-493a-b8d4-ff0729fe89de:1846971068807
5552daa2-c9f6-4635-8a7c-6f027b4aa1a3:1846971065461
.......
我有两个选择:
- 使用哈希,键为Session:Hist:[account],字段为[session],值为[时间]
- 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(即节省内存),您可以决定是否值得这样做。