RedisObject
redis是Key-Value结构,Key是String类型,Value有常见5种数据类型,Value的结构是RedisObject,
typedef struct redisObject {
//类型,占4位,五种对象类型(REDIS_STRING,REDIS_LIST,REDIS_HASH,REDIS_SET,REDIS_ZSET)
unsigned type:4;
//编码,占4位,10种编码
unsigned encoding:4;
//指针,指向底层实现数据结构
void *ptr;
//引用计数,整型,记录对象被引用次数,主要用于对象引用计数和内存回收。
int refcount;
//24位,对象最后一次被访问时间
unsigned lru:LRU_BITS;
}robj;
查看对象类型:type key
127.0.0.1:16379> type myset
set
127.0.0.1:16379>
查看对象编码方式:object encoding key type都是string,编码方式不同
127.0.0.1:16379> set qu 11
OK
127.0.0.1:16379> object encoding qu
"int"
127.0.0.1:16379> set qu2 aaaa
OK
127.0.0.1:16379> object encoding qu2
"embstr"
127.0.0.1:16379>
SDS
字符串底层对象是SDS(Simple Dynamic String),存储字符串和整型数据。 redis底层是C语言, C语言中字符串是字符数组以"\0"结尾。
struct sdshdr{
//记录buf数组中已使用字节数量
int len;
//记录buf数组中未使用字节数量
int free;
//字节数组,保存字符串
char buf[];
}
SDS优势: 1.获取字符串长度:SDS是O(1),C是O(n); 2.杜绝缓冲区溢出; 3.减少修改字符串长度时重新分配内存次数; 4.可以存二进制数据,以len属性值而不是空字符串判断是否结束。
跳跃表
|