Hello,大家好,我是阿粉~
无论你现在使用什么编程语言,每天最高频使用的应该就是字符串。可以说字符串对象很基础,也很重要。
那么今天想跟大家聊聊 Redis 字符串相关实现,来看下这个看起来简单的字符串,为什么实现起来确实不简单?
看完这篇文章你可以学到:
- Redis 字符串对象多种数据结构
- 底层数据结构转换关系
- SDS 动态字符串
- Redis 采用 C 语言实现,那么字符串为什么不直接使用 C 语言的字符串?
Redis 对象
每当我们在 Redis 中保存一对新的键值对时,Redis 至少会创建两个对象,一个对象用作保存键,而另一个对象用作保存值。
Redis 中每个对象都是一个 redisObject 结构,这个结构中有三个属性:
- type,表示对象的类型
- encoding,表示编码
- pstr,指向底层数据结构的指针
type 代表对象类型,目前可以使用类型为:
- 字符串对象
- 列表对象
- 哈希对象
- 集合对象
- 有序集合对象
我们可以使用 Redis 的 TYPE
指令,查看当前键对应值对象类型。
Redis 键对象说起来很简单,它总是是一个字符串对象,而值对象就相对复杂了,它可以是字符串,也可以是集合,也可以是字典等对象。
每个对象类型底层实现的时候将会采用了多种数据结构,而 encoding 代表底层数据结构类型:
我们可以使用 Redis 的 OBJECT ENCODING
指令查看一个当前键值对象底层的编码:
每个对象类型,可能支持多种数据结构,关系如下: