美丽的神话 发表于 2024-6-14 21:21:40

redis不同结构占用内存估算

List 结构内存占用估算

Redis 的 list 结构是用双向链表或压缩列表实现的,具体实现取决于列表的大小和元素的类型。

[*]双向链表实现(linkedlist): 当 list 的元素较多或者元素比较大时,Redis 会利用双向链表来存储数据。双向链表的内存占用包罗每个元素的存储空间以及链表节点的额外开销。


[*]每个元素的大小
[*]每个节点的额外开销(指针 + 元素的长度信息等)

[*]压缩列表实现(ziplist): 当 list 的元素较少且每个元素较小时,Redis 会利用压缩列表来存储数据。压缩列表是一个一连的内存块,避免了双向链表的指针开销。


[*]整个列表是一个一连的内存块
[*]每个元素的存储空间 + 每个元素的长度信息和一些额外的元数据
List 内存估算



[*]双向链表实现:每个节点额外开销大约 16 字节(假设每个指针 8 字节),则总内存占用:1000×(100+16)=116,000 字节
[*]压缩列表实现:假设每个元素有 2 字节的额外开销,则总内存占用:1000×(100+2)=102,000 字节
Set 结构内存占用估算

Redis 的 set 结构是用哈希表或整数集合实现的,具体实现取决于集合的大小和元素的类型。

[*]哈希表实现(hashtable): 当 set 的元素较多或者元素不是整数时,Redis 会利用哈希表来存储数据。哈希表的内存占用包罗每个元素的存储空间和哈希表节点的额外开销。


[*]每个元素的大小
[*]每个节点的额外开销(指针 + 元素的长度信息等)

[*]整数集合实现(intset): 当 set 中的所有元素都是整数且数目较少时,Redis 会利用整数集合来存储数据。整数集合是一个一连的内存块,存储整数值,避免了哈希表的指针开销。


[*]整个集合是一个一连的内存块
[*]每个整数的存储空间 + 一些额外的元数据
Set 内存估算

哈希表实现:每个节点额外开销大约 16 字节(假设每个指针 8 字节),则总内存占用:1000×(100+16)=116,000 字节
整数集合实现:假设每个整数有 4 字节(32 位整数),则总内存占用:1000×4=4,000 字节
Zset结构内存估算

在 Redis 中,Zset(有序集合)是一种用于存储多个带有分数的成员的集合,其中成员是唯一的,而分数则是双精度浮点数。为了估算一个 Redis Zset 占用的内存,可以考虑以下几个因素:

[*]底子开销:每个 Zset 需要的底子结构开销。
[*]成员数据:成员字符串的长度及其数目。
[*]分数数据:每个成员对应的分数。
[*]内部数据结构:Zset 内部利用的 SkipList 和 HashTable 的开销。
内存估算公式

假设有 N 个成员,每个成员的平均长度为 L 字节。

[*]底子结构开销:


[*]Zset 的基本结构大约需要 112 字节。

[*]成员数据:


[*]每个成员的字符串长度为 L 字节。
[*]每个成员的分数大约需要 8 字节(双精度浮点数)。
[*]成员在 HashTable 中的存储开销大约是 2 倍于成员字符串的长度(包罗哈希桶等)。

[*]内部数据结构:


[*]SkipList 节点开销:每个节点大约需要 36 字节(不包罗成员和分数)。
[*]每个成员在 SkipList 中的额外开销大约是 36 字节。
[*]HashTable 节点开销:每个节点大约需要 16 字节(不包罗成员和分数)。
综合考虑,我们可以利用以下公式来估算 Zset 的内存占用:
Total Memory≈112+N×(L+8+36+16)+2×N×L

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: redis不同结构占用内存估算