对象
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位数字是为了节约空间)。
大于32字节的字符用raw,小于等于用embstr,数字用int
列表可以被编码为 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 结构,以及它所引用的数据结构的内存,都会被释放
转载请注明原文地址: https://ju.6miu.com/read-678624.html