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: 指向底层实现数据结构的指针 void *ptr; ... } robj;
类型
对象的 type
属性记录了对象的类型, 这个属性的值可以是表 8-1 列出的常量的其中一个。
对于 Redis 数据库保存的键值对来说, 键总是一个字符串对象, 而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种, 因此:
诸如此类。
TYPE 命令的实现方式也与此类似, 当我们对一个数据库键执行 TYPE 命令时, 命令返回的结果为数据库键对应的值对象的类型, 而不是键对象的类型:
# 键为字符串对象,值为字符串对象 redis> SET msg OK redis> TYPE msg string # 键为字符串对象,值为列表对象 redis> RPUSH numbers 1 3 5 (integer) 6 redis> TYPE numbers list # 键为字符串对象,值为哈希对象 redis> HMSET profile name Tome age 25 career Programmer OK redis> TYPE profile hash # 键为字符串对象,值为集合对象 redis> SADD fruits apple banana cherry (integer) 3 TYPE fruits set # 键为字符串对象,值为有序集合对象 redis> ZADD price 8.5 apple 5.0 banana 6.0 cherry (integer) TYPE price zset
编码和底层实现
对象的 ptr
指针指向对象的底层实现数据结构, 而这些数据结构由对象的 encoding
属性决定。
encoding
属性记录了对象所使用的编码, 也即是说这个对象使用了什么数据结构作为对象的底层实现, 这个属性的值可以是表 8-3 列出的常量的其中一个。
使用 OBJECT ENCODING 命令可以查看一个数据库键的值对象的编码:
redis> SET msg hello wrold OBJECT ENCODING msg embstr redis> SET story long long long long long long ago ... OBJECT ENCODING story raw redis> SADD numbers OBJECT ENCODING numbers intsetseven1hashtable"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。