redis 对象详解(一)
2018-04-19 20:08:16 小德 Redis 访问次数 819



redis使用对象表示数据库的键和值,每当在Redis数据库里创建一个键值对,至少会创建两个对象,一个键对象,一个值对象。redis对象基于SDS,双端链表,字典,压缩列表,整数集合等数据结构,每种对象至少应用其中一种数据结构。

redis对象基于引用计数技术实现内存回收,当程序不在使用某个对象时,对象所占用内存字段释放;同时基于引用计数实现对象共享,让多个数据库键共享同一个对象来节约内存。

redis对象带有访问时间的记录信息,可用于数据库键的空转时长,在服务器启用maxmemory的情况下,空转时长较大的键会优先被服务器删除。

一、对象类型编码

    

类型对象Name
REDIS_STRING 字符串对象
REDIS_LIST列表对象
REDIS_HASH哈希对象
REDIS_SET集合对象
REDIS_ZSET有序集合对象


键总是一个字符串对象,value其他的对象类型。Type  key 命令  可返回对应值的对象类型。

编码encoding属性记录对象所使用编码,这个对象使用了什么数据结构作为底层实现。

   

编码常量编码对应的底层结构
Redis_encoding_Intlong型整数
Redis_encoding_EMBSTRembstr编码的简单动态字符串
Redis_encoding_RAW简单动态字符串
Redis_encoding_HT字典
Redis_encoding_LINKeDLIST双端链表
Redis_encoding_ZIPLIST压缩链表
Redis_encoding_INTSET整数集合
Redis_encoding_SKIPLISt跳跃表和字典

通过encoding属性设置编码而不是特定类型对象特定编码,极大提升了redis的灵活性和效率,



image.png


二、字符串对象

字符串对象可选的编码int(保存整数值)  raw(字符串对象保存值长度大于39个字节)  embstr(字符串对象保存值长度小于等于39个字节)

raw  VS  embstr  embstr用来保存短字符串,调用一次内存分配连续的一块空间,这还有利于缓存。而raw编码需要创建对象和销魂对象是需要两次内存分配和释放:redisObject 结构和sdshdr结构;embstr编码只可读 如果值有修改则变成raw

当对象值变成浮点数,对象可用long  double 类型保存,编码也是embstr 或者raw ;int 值后面append字符串值,int 编码对转换成raw ;

三、列表对象

使用编码:ziplist(压缩列表,entry节点保存值) linkedlist (双端链表,表结点node保存值,值是一个字符串对象)

-------By the  way  字符串对象是redis五种对象类型中唯一被其他四种对象嵌套的对象。

编码转换:同时满足一下两种条件使用ziplist编码,保存的所有字符串元素长度小于64个字节,保存的元素个数小于512个。(此条件可以通过配置修改)

四、哈希对象

使用编码:ziplist (新增节点保存在表尾,key  value  紧紧相邻)or   hashtable (先添加到哈希对象的键值对会被放到表头,后添加到哈希对象的键值对对被放在压缩列表的表尾对象)

编码转换:与列表对象一样。同时满足一下两种条件使用ziplist编码,保存的所有字符串元素长度小于64个字节,保存的元素个数小于512个。(此条件可以通过配置修改)