1.String类型
特征:即存储字符串的类型,单个字符串存储量最大不超过512MB
常用业务场景:⽤来存储JSON序列化之后对象
底层编码:
int编码
数据结构特点:ptr指针直接指向字符串常量池中对应字符串地址,而且数组中元素只能为数字
使⽤要求:每⼀个字符必须是数字
EmbStr编码
数据结构特点:采⽤简单动态字符串结构,这种结构的特征就在于是⼀个可扩容的字符数组,由当前已使⽤⻓度字段,当前未使⽤⻓度字段以及⼀个字符数组组成。
扩容规则:当字符数组大小小于1MB时,将总长度进行翻倍,如果字符数组大小大于1MB,那么每次增加1MB的长度
使用要求:当字符串大小小于32MB时候,采用的编码
数据结构内存地址所在:为RedisObject对象后的连续内存
Raw编码
数据结构特点:同样采用简单动态字符串作为数据结构
使用要求为当字符串大小超过32MB的时候,自动转为RAW编码
数据结构内存地址所在:不和RedisObject对象在⼀起,而是在内存中其他随机地方
重点:由于EmbStr和Raw编码中简单动态字符串结构(SDS)内存地址不同,所以最开始⽣成String对象的时候,分配内存的次数也不同,由于EmbStr的RedisObject对象和SDS对象是连续的,所以⼀起分配内存就行,但是raw需要两次内存分配
2.List类型
特征:有序,可重复列表。每个List类型可以插入(2的32次方)-1个元素
常⽤业务场景
最新与最老数据的TOP显示:由于底层采用双向链表/压缩列表的方式进行存储,均能获取头节点和尾节点指针,每个节点均有前后指针的关系,非常适合进行操作头部与尾部节点
消息队列:即⽣产者可以使⽤push方法往List类型的头部插入信息,然后消费者通过pop对List类型的尾部进行消费
底层编码:
ZipList编码
数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素大小来规定的,并不是死板的固定大小,并有记录当前最后⼀个元素位置的指针。
数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素大小来规定的,并不是死板的固定大小,使⽤要求:即当每⼀个元素大小不超过64个字节,总元素个数不超过512个并有记录当前最后⼀个元素位置的指针。
数据结构内存地址所在:作为RedisObject对象后的连续内存,所以⽣成List对象时,此编码只⽤分配⼀次内存
LinkedList编码
数据结构特点:就是双向链表
使⽤要求:当不满⾜zipList编码要求的时候,就会变成LinkedList编码
数据结构内存地址所在:不和RedisObject在⼀起,⽽是在内存中的任意位置
3.Hash类型
特征:每个Hash类型可以存放(2的32次⽅)-1个键值对
常⽤业务场景:购物车的管理,即使⽤⽤户id作为key值,⽤商品id作为field字段,⽤商品数量作为value,那么我们可以使⽤hgetAll指令完成购物⻋全选,hdel删除指定商品等等操作
底层编码:
ZipList编码
数据结构特点:和List类型采⽤此编码时运⽤不太⼀样,Hash类型会把field-value键值对连续的插⼊到压缩列表中,从⽽完成不同键值对的存储
使⽤要求:即当每⼀个元素⼤⼩不超过64个字节,总元素个数不超过512个
数据结构内存地址所在:作为RedisObject对象后的连续内存,所以⽣成List对象时,此编码只⽤分配⼀次内存
Hashtable编码
数据结构特点:底层为哈希表数据结构,⽤以存储field-value键值对
使⽤要求:当不满⾜zipList编码要求的时候,就会变成LinkedList编码
4.Set类型
特征:为⽆序,⽽不可重复集合,可以存放(2的32次⽅)-1个元素
常使⽤业务场景:
元素去重:即⼤量元素去重操作会占⽤⼤量CPU资源,那么把这些数据存储到Set类型中,即可完成去重操作
共同好友等:把⼀个⽤户的好友和另⼀个⽤户的好友进⾏交集处理,得到他们的公同好友,然后进⾏推荐
底层编码:
Inset编码
数据结构特点:即由整型数组组成的连续内存(此数组按元素⼤⼩进⾏排序),但是除了整形数组外,还有有当前数组包含的元素数量以及采⽤整形的编码,可分为int16,int32,int64.分别是整形数组中运⾏存放数值的⼤⼩
使⽤要求:元素个数⼩于512个,⽽且集合内元素全为数字
数据结构内存地址所在:和RedisObject相连的连续内存
HT编码
数据结构特点:由Value值为空的Hashtable结构组成,被称为字典。
使⽤要求:当不满⾜inset编码要求的时候,就会变成HT编码
5.ZSet类型
特征:为有序,⽽不可重复集合,可以存放(2的32次⽅)-1个元素
常使⽤业务场景:热⻔数据TOP排⾏榜,即利⽤Zset类型,有序不重复特点,把重复的数据进⾏去重并且使⽤score字段排序后,从⼩到⼤排序,反序即可得到热⻔数据TOP排⾏榜
底层编码:
ZipList编码
数据结构特点:压缩列表的另⼀种使⽤,即使⽤⼀个新增的score字段来决定元素在压缩列表中的位置,默认从⼩到⼤
使⽤要求:元素单个⼤⼩不能超过64字节,压缩数组⻓度不能超过128个元素
数据结构内存地址所在:和RedisObject相连的连续内存
skipList编码
数据结构特点:通过跳表与Hashtable的集合编码,利⽤跳表存储hash表中的节点来完成有序,操作主要还是在hash表中,跳表中的⼤⼩由Score字段来决定
使⽤要求:当不满⾜zipList编码要求的时候,就会变成skipList编码