1.简介:
redis 不直接通过数据结构操作数据,通过对象操作数据。
2.对象的类型和编码:
redis 通过对象来表示数据库中的键和值,每次在数据库中创建一条数据时,至少保存了两个对象,一个是键对象,一个值对象。
redis 中的每个对象有一个 redisObject 结构表示,该结构中和保存数据有关的三个属性分别是 type , encoding ,ptr 。
类型 :
type 对应下面几种类型:
类型常量 | 对象的名称 |
---|---|
REDIS_STRING | 字符串对象 |
REDIS_LIST | 列表对象 |
REDIS_HASH | 哈希对象 |
REDIS_SET | 集合对象 |
REDIS_ZSET | 有序集合对象 |
查询一个值是什么类型:
TYPE 键名称
TYPE 命令对应的数据类型:
对象 | 对象TYPE的属性值 | TYPE命令的输出 |
---|---|---|
字符串对象 | REDIS_STRING | "string" |
列表对象 | REDIS_LIST | "list" |
哈希对象 | REDIS_HASH | "hash" |
集合对象 | REDIS_SET | "set" |
有序集合对象 | REDIS_ZSET | "zset" |
2. 编码和底层实现:
对象的 ptr 指针指向对象的底层实现数据结构,而这些数据结构有对象的 encoding 属性决定。encoding 属性记录了对象所使用的编码。
TODO:
3. 字符串对象 :
字符串对象的编码可以是 int , raw , emstr 。
TODO:
4. 列表对象 :
列表对象的编码可以是 ziplist 或者 linkedlist 。
TODO:
5. 哈希对象 :
哈希对象的编码可以是 ziplist 或者 hashtable 。
TODO:
6. 集合对象 :
集合对象的编码可以是 insert 或者 hashtable 。
TODO:
7. 有序集合对象 :
有序对象的编码可以是 ziplist 或者 skiplist 。
TODO:
8. 类型检查和命名多态 :
TODO:
9. 内存回收 :
因为 c 语言不具备自动回收的功能,所以 redis 在自己的对象系统中创建了引用计数器来实现垃圾回收机制。 在 redisObject 结构中有一个属性是 refCount 来实现垃圾回收的功能。
对象的生命周期分为: 创建对象,操作对象,释放对象 。
1. 创建对象 refCount 的值加 1
2. 当对象被一个新程序使用时,他的引用会加 1 .
3. 当对象不在被一个对象使用时,引用减 1 .
4. 当对象引用计数为 0 时,对象所占用的内存将会被释放 .
10. 对象共享 :
就是如果存的值相同时,redis 将会将键的指针指向数据库中原本就存在的值 。
网友评论