redis--5大对象-8种编码

来源:互联网 发布:查看淘宝店铺销售额 编辑:程序博客网 时间:2024/05/29 04:34

第一节:5大对象,8大编码

这里写图片描述
这里写图片描述
这里写图片描述

第二节:字符串对象–REDIS_STRING

a、int编码:对象内容是整数,并且可以用Long类型来表示

这里写图片描述

b.raw编码: 大于32个字节,两块内存

这里写图片描述

c.embstr编码:小于32字节,两块内存连续,节省空间

这里写图片描述

转换:int,embstr会自动转换成raw,因为int可能用Long保存不了,embstr是只读的,如果重写会变成raw

第三节:列表对象-REDIS_LIST

a.ziplist编码:压缩列表,内存连续的对象,类似链表:主要是在,单个节点小于64字节,节点数小于512个

这里写图片描述

b.linkedlist编码:双端链表,单节点大于64字节,或节点数大于521个

这里写图片描述

这个中编码的链表对象,是唯一会被其他对象嵌套的对象(其实字符串对象也是,并且应用最广)

第四节:哈希对象-REDIS_HASH

a.ziplist编码:压缩列表,key在前,value在后的存储模式:同理,要满足单节点字节小于64,且,节点数小于512

这里写图片描述

b.hashtable编码:字典的实现方式,字典中,key是一个字符串对象,value也是一个字符串对象

这里写图片描述

第五节:集合对象-REDIS_SET

a.intset编码:整数集合—-能用整数表示,且节点数小于512

这里写图片描述

b.hashtable编码:字典-不能用int表示,或者节点数大于512个,keyf保存对象值,value为NUll

这里写图片描述

第六节:有序集合对象-REDIS_ZSET

a.ziplist编码:压缩列表–值放在前,比对的对象跟在后面,有序,单节点小64,节点个数大于128个

这里写图片描述

b.skiplist编码:字典+跳跃表,字典使得查询更快,跳跃表维护大小关系

这里写图片描述

字典中,key保存对象,value保存分值,跳跃表中,object为key,分值来排序。
其实字典和跳跃表,里面都是用的指针进行分享,减少内存二次开销

总结归纳:
1.字符串数组是字符串对象的基础,而字符串对象是其他对象的基础,也是应用最广的对象

2、list-双端链表,只在列表对象REDIS_LIST中,且只在字节数太大大于64个字节,或者节点个数大于512个数使用

3、跳跃表–只在有序集合对象中,且单节点大于64字节,或者个数大于128个排序点时使用

4、字典–在哈希对象,集合对象,有序集合对象中使用,且条件也是,单个节点大于64,节点数大于512或者128个时使用
哈希对象:正常使用
集合对象:key存对象内容,value写null
有序集合对象:key存值,value存分值

5、压缩列表:使用场景,列表对象,哈希对象,有序集合对象中使用
列表对象:正常使用
哈希对象:key在前,value在后存储
有序集合对象:值在前,分值在后,分值从小到大排序

再次归纳:
为了节省空间,字符串对象会进行压缩或者用整形字符串这种编码方式节省空间
其他对象在对象节点少于一定个数的时候,用压缩列表进行存储,只有字节够大或者节点数够多采用各自的存储方式

为了节省内存,redis还做了什么:
有序集合对象种,字典和跳跃表共享内容
1、内存回收:采用引用计数器,如果计数为0,在合适的时候会被删除
2、0~10000整数共享:启动的时候,会在内存初始化,每次使用到的时候,就是用指针,形成共享