ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-03-11 12:06:32  阅读:182  来源: 互联网

标签:编码 ENCODING redis5 ZIPLIST 元素 REDIS 对象 字符串 优劣势


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设计与实现》

 

标签:编码,ENCODING,redis5,ZIPLIST,元素,REDIS,对象,字符串,优劣势
来源: https://www.cnblogs.com/yq055783/p/15993138.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有