Redis对象系统
前面介绍了Redis用到的所有主要数据结构,如简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等
Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。
Redis对象系统还实现了内存回收机制、对象共享机制。Redis的对象带有访问时间记录信息,该信息可以用于计算数据库键的空转时长,空转时长较大的那些键可能会优先被服务器删除。
SET命令创建一个新的键值对,SET msg “hello world”
包含两个对象,键对象和值对象,每个对象都由一个redis对象结构表示,有3个属性和保存数据有关,type类型,encoding:编码和ptr:指向底层实现数据结构的指针。
键总是一个字符串对象,值可以是字符串对象、列表对象、哈希对象、集合对象或有序集合对象中的一种。
Redis > SET msg“hello world” 字符串对象
Redis >RPUSHnumbers 1 3 5 列表对象
Redis> HMSETprofile name Tom age 25 career Programmer 哈希
Redis>SADDfruits apple banana cherry 集合
Redis>ZADDprice 8.5 apple 5.0 banana 6.0 cherry 有序集合
使用OBJECT ENCODING命令可以查看一个数据库键的值对象的编码
String——INT整形、RAW简单动态字符串
LIST——ZIPLIST压缩列表、LINKEDLIST双端链表
HASH——ZIPLIST压缩列表、HT字典
SET——INTSET整数集合、HT字典
ZSET——ZIPLIST压缩列表、SKIPLIST跳跃表和字典
通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率。
比如:在列表对象包含的元素比较少时,Redis使用压缩列表作为列表对象的底层实现:
因为压缩列表比双端链表更节约内存,并且在元素数量较少时,在内存中以连续块方式保存的压缩列表比起双端链表可以更快地载入到缓存中。
随着列表对象包含的元素越来越多,使用压缩列表来保存元素的优势逐渐消失,对象就会将底层实现从压缩列表转向功能更强、也更适合保存大量元素的双端链表上面。