- String
基本编码方式是raw,基于简单的动态字符串实现(SDS),存储上线512Mb;
如果存储的SDS长度小于44字节,则会采用embstr编码,此时RedisObject中Object Head和要存储的SDS是一段连续空间,申请内存时只需要调用一次内存分配函数即可;
如果存储的字符串是整数类型,并且大小在Long_Max范围内,则会采用int编码。直接将数据保存在RedisObject中的ptr指针位置,刚好8字节大小,不再需要SDS。
- List
在3.2版本之前,List底层实现方式LinkedList加上ZipList,当元素数量小于512并且元素大小小于63字节时采用ZipList,超过则采用LinkedList;
在3.2版本之后,Redis统一采用QuickList来实现list,可以从双端访问,包含多个ZipList,存储上限高。
- Set
set是redis当中的集合,不一定保证元素有序,但是一定保证元素唯一,查询效率高;
set底层采用Hash(Dict),Dict中用key来存储值,value统一为null;
当存储的数据都是整数时,并且元素数量不超过默认值,set会采用intSet编码,节省内存;
- ZSet
ZSet底层数据结构必须满足键值存储,键必须唯一,可排序;
底层的数据结构是SkipList加上Hash(Dict)来实现的;
当元素数量不多的时候,Dict和SkipList的优势不明显,而且更耗费内存,此时ZSet底层会采用ZipList结构;
ZipList本省没有排序和键值对的功能,因此需要对ZipList继续进行编码,因此element在前,score在后;score越小越接近队首,按照score值升序排列。
- Hash
Hash底层采用的数据结构和ZSet类似,只需要把排序有关的SkipList去掉即可;
Hash默认采用ZipList,节省内存,相邻的两个entry分别保存键和值;
当数据量较大的时候,Hash底层采用Dict结构