对象
- redis有5种对象:字符串对象、列表对象、集合对象、哈希对象、有序集合对象。
- redis中有6中主要数据结构:简单动态字符串(SDS)、链表、字典、跳跃表、整数集合、压缩列表。
- redis对象主要包含以下属性:
/** Redis 对象*/typedef struct redisObject {// 类型unsigned type:4;// 对齐位unsigned notused:2;// 编码方式unsigned encoding:4;// LRU 时间(相对于 server.lruclock)unsigned lru:22;// 引用计数int refcount;// 指向对象的值void *ptr;} robj;
- 对象编码表示对象使用的数据结构:
/** 对象编码*/#define REDIS_ENCODING_RAW // 编码为字符串#define REDIS_ENCODING_EMBSTR // 编码为embstr编码的SDS#define REDIS_ENCODING_INT // 编码为整数#define REDIS_ENCODING_HT // 编码为哈希表#define REDIS_ENCODING_ZIPMAP // 编码为 zipmap#define REDIS_ENCODING_LINKEDLIST // 编码为双端链表#define REDIS_ENCODING_ZIPLIST // 编码为压缩列表#define REDIS_ENCODING_INTSET // 编码为整数集合#define REDIS_ENCODING_SKIPLIST // 编码为跳跃表
- 对象可以以多种方式编码:
- 字符串可以被编码为 raw、embstr、int (用字符串表示64位数字是为了节约空间)。
- 列表可以被编码为 ziplist 或 linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊表示。
列表所有元素小于64字节且数量小于512时使用ziplist,否则用linkedlist。该上限值可以通过参数修改
- 集合可以被编码为 intset 或者 hashtable 。 intset 是只储存数字的小集合的特殊表示。
集合所有元素是整数值且数量小于512时使用intset,否则用hashtable。该上限值可以通过参数修改
- 哈希表可以编码为 ziplist 或者 hashtable 。 ziplist 是小哈希表的特殊表示。
哈希表所有元素小于64字节且数量小于512时使用ziplist,否则用hashtable。该上限值可以通过参数修改
- 有序集合可以被编码为 ziplist 或者 skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。
有序集合所有元素小于64字节且数量小于128时使用ziplist,否则用skiplist。该上限值可以通过参数修改
对象内存回收
对象采用引用计数计数实现内存回收。
- 每个 redisObject 结构都带有一个 refcount 属性,指示这个对象被引用了多少次。
- 当新创建一个对象时,它的 refcount 属性被设置为 1 。
- 当对一个对象进行共享时,Redis 将这个对象的 refcount 增一。
- 当使用完一个对象之后,或者取消对共享对象的引用之后,程序将对象的 refcount 减一。
- 当对象的 refcount 降至 0 时,这个 redisObject 结构,以及它所引用的数据结构的内存,都会被释放