redis中总共有五种类型的对象,分别是:字符串对象、双端链表、字典、压缩列表、整数集合。上述的五种类型的对象均具有相同的结构:
typedef struct redisobject{ //类型 type , // 编码 encoding , // 指向地层数据结构的指针 *ptr, // 最后访问时间 lasttime // 引用数量 refCount }
类型
对象的类型总共为五种,如下:
- REDIS_STRING : 字符串对象
- REDIS_LIST : 列表对象
- REDIS_HASH : 哈希对象
- REDIS_SET : 集合对象
- REDIS_ZSET : 有序集合对象
可以通过 type 命令验证 redis对象的类型
编码
编码决定了redis对象保存过程中所采用的数据结构。redis中对象的编码总共有如下八种:
- REDIS_ENCODING_INT : LONG类型的整数
- REDIS_ENCODING_EMBSTR : embstr 编码的简单动态字符串
- REDIS_ENCODING_RAW : 简单动态字符串
- REDIS_ENCODING_HT : 字典
- REDIS_ENCODING_LINKEDLIST : 双端链表
- REDIS_ENCODING_ZIPLIST : 压缩列表
- REDIS_ENCODING_INTSET : 整数集合
- REDIS_ENCODING_SKIPLIST : 跳跃表 和字典
redis中的对象与编码之间的对应关系就不一一列举了,每种对象都会采用两种编码格式。在对象占用内存较小时,redis采用一种编码;当对象占用较大的内存时,redis则会换种数据结构。
可以应用object encoding 命令验证对象的编码
引用数量
说到引用数量,便需要介绍下redis的内存回收机制。redis跟踪对象的引用计数,若是引用计数为零,则自动回收此对象。机制如下:
- 开始,创建一个对象,此对象的引用计数加1
- 若是此对象被另外一个键值引用,则此对象的引用计数加1
- 若是此对象不被另外程序使用,则此对象的引用计数减1
- 当次对象的引用计数为0 , 对象的内存自动释放
最后访问时间
每次访问redis的对象,此对象便会记录对象的最后访问时间。object idletime 命令可以查看对象的空转时长,即当前时间-最后访问时间。