🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### **什么是Redis的对象系统** ***** #### **对象系统简介** Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。 ` ` #### **对象系统的好处** * Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。 * 我们可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率. >Redis的对象系统还实现了基于引用计数技术的内存回收机制,当程序不再使用某个对象的时候,这个对象所占用的内存就会被自动释放;另外,Redis还通过引用计数技术实现了对象共享机制,这一机制可以在适当的条件下,通过让多个数据库键共享同一个对象来节约内存 ` ` ### **Redis对象的原理** ***** #### **对象的类型与编码** ***** Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。 ` ` 示例: `SET`设置键值对的键是一个包含了字符串值"msg"的对象,而键值对的值则是一个包含了字符串值"hello world"的对象: ``` redis> SET msg "hello world" OK ``` Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性和ptr属性: ``` typedef struct redisObject {     //  类型     unsigned type:4;     //  编码     unsigned encoding:4;  // 指向底层实现数据结构的指针     void *ptr;     // ... } robj; ``` ` ` ##### **类型** 对象的type属性记录了对象的类型: ![GZ0hZV.png](https://s1.ax1x.com/2020/03/29/GZ0hZV.png) ` ` 对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种,因此: * 当我们称呼一个数据库键为“**字符串键**”时,我们指的是“这个数据库键所对应的值为**字符串对象**”; * 当我们称呼一个键为“**列表键**”时,我们指的是“这个数据库键所对应的值为**列表对象**”。` ` TYPE命令的实现方式也与此类似,当我们对一个数据库键执行TYPE命令时,命令返回的结果为数据库键对应的值对象的类型,而不是键对象的类型: ``` # 键为字符串对象,值为字符串对象 redis> SET msg "hello world" OK redis> TYPE msg string # 键为字符串对象,值为列表对象 redis> RPUSH numbers 1 3 5 (integer) 6 redis> TYPE numbers list #  键为字符串对象,值为哈希对象 redis> HMSET profile name Tom age 25 career Programmer OK redis> TYPE profile hash #  键为字符串对象,值为集合对象 redis> SADD fruits apple banana cherry (integer) 3 redis> TYPE fruits set #  键为字符串对象,值为有序集合对象 redis> ZADD price 8.5 apple 5.0 banana 6.0 cherry (integer) 3 redis> TYPE price zset ``` TYPE命令在面对不同类型的值对象时所产生的输出: ![GZBQQs.png](https://s1.ax1x.com/2020/03/29/GZBQQs.png) ` ` ##### **编码和底层实现** 对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。 encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以是下表列出的常量的其中一个: ![GZBWSH.png](https://s1.ax1x.com/2020/03/29/GZBWSH.png) ` ` ### **Redis对象的应用场景** *****