简略答案:在Redis的hash结构使用ziplist编码且存储相同信息时,hash结构比sring结构更加节省内存。
1. 分析:谁更加节省内存
string结构:
可以简单任务Redis的String结构是用SDS(简单动态字符串)数据结构来实现的。

- len:buf中已占用空间的长度;
- free:buf中剩余可用空间的长度;
- buf[]:数据空间
hash结构使用ziplist结构时:

- zlbytes:32bit,表示ziplist占用的字节总数。
- zltail:32bit,表示ziplist表中最后一项(entry)在ziplist中的偏移字节数。通过zltail我们可以很方便地找到最后一项,从而可以在ziplist尾端快速地执行push或pop操作,保证了时间复杂度为O(1)
- zlen:16bit, 表示ziplist中数据项(entry)的个数。
- entry:表示真正存放数据的数据项,长度不定。
- zlend: ziplist最后1个字节,是一个结束标记,值固定等于255。
ziplist最大的特点就是,他不是hashtable结构,而是一个比较长的字符串,将key-value都按照顺序依次摆放到一个长长的字符串里来存储。如果要找某个key,就需要遍历整个长字符串。

Redis中,使用ziplist编码的Hash结构比String结构更省内存。String每个记录包含len和free,而ziplist紧凑存储数据,仅需少量标识位。当hash内层field-value数量≤512且value字节≤64时,Redis倾向于使用ziplist编码,以节省内存,尽管查询可能消耗更多CPU。
1611

被折叠的 条评论
为什么被折叠?



