07 Redis-对象的类型与编码

本文内容均来自《Redis设计与实现》一书 

前言 

Redis用的主要数据结构有简单动态字符串、双端链表、字典、压缩列表、跳跃表、整数集合等。但是Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构构建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象五种类型的对象,每种对象用到至少一种前面的数据结构。

通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。同时,我们可以针对不同的使用场景,为对象设置不同的数据结构,从而优化对象在不同场景下的使用效率。

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

Redis的对象带有访问时间记录信息,该信息可以用于计算数据库键的空转时间,在服务器启用了maxmemory功能的情况下,空转时间较大的那些键可能会优先被服务器删除。

1. 定义

Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个用作键值对的值(值对象)。

 结构

// Redis对象
typedef struct redisObject {

    // 类型
    unsigned type:4;

    // 编码
    unsigned encoding:4;

    // 指向底层实现数据结构的指针
    void *ptr;

    // ······
} robj;

2.类型

对象的type属性记录了对象的类型。

对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值可以是五种类型的对象中的其中一种。

TYPE命令:当对一个数据库键执行TYPE命令时,命令返回的结果为数据库键对应的值对象的类型,而不是键对象的类型。

不同类型值对象的TYPE命令输出
对象对象type属性的值TYPE命令的输出
字符串对象REDIS_STRING"string"
列表对象REDIS_LIST"list"
哈希对象REDIS_HASH"hash"
集合对象REDIS_SET"set"
有序集合对象REDIS_ZSET"zset"

 

 

 

 

 

 

 

3.编码 

 对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。

 encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现。

OBJECT ENCODING命令:查看一个数据库键的值对象的编码。

OBJECT ENCODING对不同编码的输出
编码常量编码所对应的底层数据结构OBJECT ENCODING命令输出
REDIS_ENCODING_INTlong类型的整数"int"
REDIS_ENCODING_EMBSTRembstr编码的简单动态字符串"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_STRINGREDIS_ENCODING_INT使用整数值实现的字符串对象
REDIS_STRINGREDIS_ENCODING_EMBSTR使用embstr编码的简单动态字符串实现的字符串对象
REDIS_STRINGREDIS_ENCODING_RAW使用简单动态字符串实现的字符串对象
REDIS_LISTREDIS_ENCODING_ZIPLIST使用压缩列表实现的列表对象
REDIS_LISTREDIS_ENCODING_LINKEDLIST使用双端链表实现的列表对象
REDIS_HASHREDIS_ENCODING_ZIPLIST使用压缩列表实现的哈希对象
REDIS_HASHREDIS_ENCODING_HT使用字典实现的哈希对象
REDIS_SETREDIS_ENCODING_INTSET使用整数集合实现的集合对象
REDIS_SETREDIS_ENCODING_HT使用字典实现的集合对象
REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表实现的有序集合对象
REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象

 

 

 

 

 

 

 

 

 

 

 

 

 

通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值