Redis 中的对象介绍

版权声明:转载请注明出处! https://blog.csdn.net/zjq_1314520/article/details/79084997

Redis底层使用到的主要数据结构有:简单动态字符串,双端链表,字典,压缩列表,整数集合
Redis 并没有直接使用这些数据结构来实现K-Value数据库,而是基于这些数据结构创建了一个对象系统。

这篇文章就是简要的介绍一下Redis的对象的结构。


Redis的对象系统有五个部分组成:字符串对象,列表对象,哈希对象,集合对象和有序集合对象

Redis对象的数据结构

Redis的每一个对象都是由一个redisObject结构表示,其定义如下

/**
 * redisObject Redis对象
 */ 
typedef struct redisObject {

    unsigned type : 4; // 类型

    unsigned encoding : 4; // 编码

    int refcount; // 引用计数

    void *ptr; // 指向底层实现数据结构的指针(实际值)
} robj;

首先我们看一下refcount属性

127.0.0.1:6381> object refcount msg
(integer) 1

Redis对象系统中实现了基于引用计数技术的内存回收机制,当程序不在使用某个对象的时候,这个对象所占用的内存就会自动的释放。
Redis还通过引用计数技术实现了对象共享机制,在适当的条件下,可以通过让多个数据库键共享同一个对象来节约内存。


对象的type属性记录了对象的类型,我们可以使用type key指令来查看当前对象的类型

127.0.0.1:6381> type msg
string

其中type指令和redisObject中的type属性的对应关系为

对象 type属性值 TYPE指令的输出值
字符串对象 REDIS_STRING “string”
列表对象 REDIS_LIST “list”
哈希对象 REDIS_HASH “hash”
集合对象 REDIS_SET “set”
有序集合对象 REDIS_ZSET “zset”

注:其中TYPE指令的输出值为键值对中的值得类型,键值对得键得类型会一直都是字符串对象。


ecoding属性记录了对象所使用的编码,即该对象使用了什么数据结构做为底层实现。

ecoding属性值和底层数据结构的对应关系如下

ecoding属性值 底层数据结构
REDIS_ENCODING_INT long类型的整数
REDIS_ENCODING_EMBSTR embstr编码的简单动态字符串
REDIS_ENCODING_RAW 简单动态字符串
REDIS_ENCODING_HT 字典
REDIS_ENCODING_LINKEDLIST 双端链表
REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_ENCODING_INTSET 整数集合
REDIS_ENCODING_SKIPLIST 跳跃表和字典
REDIS_ENCODING_QUICKLIST 快速列表(redis-3.2+)

每个redisObject对象的实现都至少使用了两种不同的数据结构,如下表显示了每种对象可以使用的数据结构

类型 ecoding属性值(编码) 对象
REDIS_STRING REDIS_ENCODING_INT 使用整数值实现的字符串对象
REDIS_STRING REDIS_ENCODING_EMBSTR 使用embstr编码的简单动态字符串实现的字符串对象
REDIS_STRING REDIS_ENCODING_RAW 使用简单动态字符串实现的字符串对象
REDIS_LIST REDIS_ENCODING_ZIPLIST 使用压缩列表实现的列表对象
REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端列表实现的列表对象
REDIS_LIST REDIS_ENCODING_QUICKLIST 使用快速列表实现的列表对象
REDIS_HASH REDIS_ENCODING_ZIPLIST 使用压缩列表实现的哈希对象
REDIS_HASH REDIS_ENCODING_HT 使用字典实现的哈希对象
REDIS_SET REDIS_ENCODING_INTSET 使用整数集合实现的集合对象
REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象
REDIS_ZSET REDIS_ENCODING_ZIPLIST 使用压缩列表实现的有序集合对象
REDIS_ZSET REDIS_ENCODING_SKIPLIST 使用跳跃表和字典实现的有序集合对象

我们使用OBJECT ENCODING KEY指令可以查看一个数据库键对应的对象的编码

-----------------------------
127.0.0.1:6381> set msg 2
OK
127.0.0.1:6381> OBJECT ENCODING msg
"int"
-----------------------------
127.0.0.1:6381> set msg hello
OK
127.0.0.1:6381> OBJECT ENCODING msg
"embstr"
-----------------------------
127.0.0.1:6381> set msg hellohellohellohellohellohellohellohellohellohellohellohello
OK
127.0.0.1:6381> OBJECT ENCODING msg
"raw"
-----------------------------
127.0.0.1:6381> SADD numbers "one"
(integer) 1
127.0.0.1:6381> OBJECT ENCODING numbers
"hashtable"
-----------------------------
127.0.0.1:6381> DEL numbers
(integer) 1
127.0.0.1:6381> SADD numbers 1 3 5
(integer) 3
127.0.0.1:6381> OBJECT ENCODING numbers
"intset"
-----------------------------
127.0.0.1:6381> LPUSH list 1 2 3
(integer) 3
127.0.0.1:6381> OBJECT ENCODING list
"quicklist"
-----------------------------
127.0.0.1:6381> ZADD set 1 one 2 two
(integer) 2
127.0.0.1:6381> OBJECT ENCODING set
"ziplist"
-----------------------------

不同对象的OBJECT ENCODING KEY指令的输出关系如下

对象所使用的底层数据结构 ecoding属性值(编码常量) OBJECT ENCODING KEY指令的输出
long类型的整数 REDIS_ENCODING_INT “int”
embstr编码的简单动态字符串 REDIS_ENCODING_EMBSTR “embstr”
简单动态字符串 REDIS_ENCODING_RAW “raw”
字典 REDIS_ENCODING_HT “hashtable”
双端链表 REDIS_ENCODING_LINKEDLIST “linkedlist”
压缩列表 REDIS_ENCODING_ZIPLIST “ziplist”
整数集合 REDIS_ENCODING_INTSET “intset”
跳跃表和字典 REDIS_ENCODING_SKIPLIST “skiplist”
快速列表 REDIS_ENCODING_QUICKLIST “quicklist”
阅读更多

没有更多推荐了,返回首页