微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

redis5大对象的底层编码、使用条件和优劣势总结

1.redis5大对象底层编码

类型

编码

对象

REdis_STRING

REdis_ENCODING_INT

使用整数值实现的字符串对象

REdis_ENCODING_EMBSTR

使用embstr编码的简单动态字符串实现的字符串对象

REdis_ENCODING_RAW

使用简单动态字符串实现的字符串对象

REdis_LIST

REdis_ENCODING_ZIPLIST

使用压缩列表实现的列表对象

REdis_ENCODING_LINKEDLIST

使用双端链表实现的列表对象

REdis_HASH

REdis_ENCODING_ZIPLIST

使用压缩列表实现的哈希对象

REdis_ENCODING_HT

使用字典实现的哈希对象

REdis_SET

REdis_ENCODING_INTSET

使用整数集合实现的集合对象

REdis_ENCODING_HT

使用字典实现的集合对象

REdis_ZSET

REdis_ENCODING_ZIPLIST

使用压缩列表实现的有序集合对象

REdis_ENCODING_SKIPLIST

使用跳跃表和字典实现的有序集合对象

 

 

2.redis对象使用不同编码的条件

 

类型

编码

条件

备注

REdis_STRING

REdis_ENCODING_INT

保存的是整数值,并且这个整数值可以用long类型表示

 

REdis_ENCODING_EMBSTR

保存的是字符串值,并且这个字符串值的长度<= 32

 

 

REdis_ENCODING_RAW

保存的是字符串值,并且这个字符串值的长度 > 32

 

REdis_LIST

REdis_ENCODING_ZIPLIST

同时满足:

所有的字符串元素的长度 < 64

保存的元素个数 < 512

list-max-ziplist-value和

list-max-ziplist-entries选项修改

REdis_ENCODING_LINKEDLIST

一个条件满足:

一个字符串元素的长度 >= 64

保存的元素个数 >= 512

 

REdis_HASH

REdis_ENCODING_ZIPLIST

同时满足:

所有的字符串元素的长度 < 64

保存的元素个数 < 512

 

REdis_ENCODING_HT

一个条件满足:

一个字符串元素的长度 >= 64

保存的元素个数 >= 512

 

REdis_SET

REdis_ENCODING_INTSET

同时满足:

保存的所有元素都是整数值

保存的元素个数 < 512

 

REdis_ENCODING_HT

一个条件满足:

一个元素不是整数值

保存的元素个数 >= 512

 

REdis_ZSET

REdis_ENCODING_ZIPLIST

同时满足:

所有的字符串元素长度 < 64

保存的元素个数 < 128

 

REdis_ENCODING_SKIPLIST

一个条件满足:

一个字符串元素长度 >= 64

保存的元素个数 >= 128

 

 

3.redis不同编码的优劣势

 

类型

编码

优劣势

REdis_STRING

REdis_ENCODING_INT

 

REdis_ENCODING_EMBSTR

优势:

1.字符串对象的所有数据都保存在一块连续的内存里,更好利用缓存

2.内存分配和释放各自只有一次

劣势:

1.不支持修改操作

2.连续空间不好开辟

REdis_ENCODING_RAW

 

REdis_LIST

REdis_ENCODING_ZIPLIST

优势:

1.使用的是连续内存块,存储和读取效率高

劣势:

1.不利于插入和删除这种需要频繁申请和释放内存的操作

2.ziplist长度很长时,需要分配连续空间大,一次realloc重新分配内存时要耗费更长的空间。

REdis_ENCODING_LINKEDLIST

优势:

1.插入和删除的时间复杂度很低

劣势:

1.每个节点需要维护两个指针,增加开销

2.每个节点都是单独的内存块,地址不一定连续,导致内存回收时内存碎片率高

3.访问时间复杂度较高

 

现在REdis_LIST统一用”quicklist”数据结构。

REdis_HASH

REdis_ENCODING_ZIPLIST

劣势:

1.每次插入或修改引发的realloc操作会有更大概率造成内存拷贝,降低性能

2.当ziplist数据项过多,查找指定的数据项的性能会遍历,需要遍历整个list

REdis_ENCODING_HT

 

REdis_SET

REdis_ENCODING_INTSET

 

REdis_ENCODING_HT

 

REdis_ZSET

REdis_ENCODING_ZIPLIST

 

REdis_ENCODING_SKIPLIST

优势:

同时使用了哈希表和跳跃表来实现。

使用哈希表,可以在o(1)内获取指定成员的分数:zscore

使用跳跃表,可以o(logn)的时间复杂度执行范围型操作:zrange、zrank,而不需要排序。

 

来源:《redis设计与实现》

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐