对象
-
redis并没有直接使用之前学的数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统
-
这个对象系统包含了字符串对象、列表对象、哈希对象、集合对象、有序集合对象这五种,每个对象都用到了至少一种之前的数据结构
-
redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令
-
我们也可以针对不同的使用环境为对象设置多种不同的数据结构实现,从而优化对象在不同 在不同场景下的使用效率
-
reids的对象系统还实现了基于引用计数技术的内存回收机制,当程序不再使用某个对象时,会将其所占内存释放,另外redis还通过引用计数技术实现了对象共享机制,这一机制可以让多个数据库共享同一个对象来节约内存
-
reids的对象带有访问时间记录信息,该信息可以计算数据库键的空转时长,在服务器启用了maxmemory功能的情况下,空转时长较大的那些键可能会优先被删除
-
对象的类型与编码:
-
我们创建键值对时,就至少会创建两个对象,一个键对象,一个值对象
-
redis中的每一个对象都是由一个reidsObject结构来表示:
typedef struct reidsObject { //类型 unsigned type: 4; //编码 unsigned encoding: 4; //指向底层实现数据结构的指针 void *ptr; // ... } robj
-
类型:
- 对键使用type命令可以显示其键对应值的类型
-
编码和底层实现:
- ptr指针指向对象的底层实现数据结构,而这些数据结构是由对象的encoding属性决定的
- encoding记录了2对象所使用的编码,也就是说这个对象使用了什么数据结构作为对象的底层实现
- 每种类型的对象都至少使用了两种不同的编码,每种编码对应了一种底层数据结构
- 通过encoding来为对象设定编码,极大地提高了redis的灵活性和效率
-