● 请问Redis的数据类型有哪些,底层怎么实现?
1)字符串:整数值、embstr编码的简单动态字符串、简单动态字符串(simple dynamic string)
2)列表:压缩列表、双端链表
3)哈希:压缩列表、字典
4)集合:整数集合、字典
5)有序集合:压缩列表、跳跃表和字典
数据结构
- Redis 内部使用字典来存储不同类型的数据,如下图中的
dictht
,字典由一组dictEntry
组成,其中包括了指向 key 和 value 的指针以及指向下一个 dictEntry 的指针。
- 在 Redis 中,所有的对象都被封装成了 redisObject,如图中浅绿的模块。
- redisObject 包括了对象的类型,就是 Redis 支持的 string、hash、list、set 和 sorted set 5种类型。
- 另外 redisObject 还包括了具体对象的存储方式,如图最右边的虚线标出的模块内的几种类型。
Redis 有 8 种核心数据类型
- Redis数据结构与内部编码的关系
- bitmap 位图类型;
- geo 地理位置类型;
- HyperLogLog 基数统计类型。
string 字符串
- string 是 Redis 的最基本数据类型。可以把它理解为 Mc 中 key 对应的 value 类型。string 类型是二进制安全的,即 string 中可以包含任何数据。
- Redis 中的普通 string 采用 raw encoding 即原始编码方式,该编码方式会动态扩容,并通过提前预分配冗余空间,来减少内存频繁分配的开销。
- 在字符串长度小于 1MB 时,按所需长度的 2 倍来分配,超过 1MB,则按照每次额外增加 1MB 的容量来预分配。
- Redis 中的数字也存为 string 类型,但编码方式跟普通 string 不同,数字采用整型编码,字符串内容直接设为整数值的二进制字节序列。
- 在存储普通字符串,序列化对象,以及计数器等场景时,都可以使用 Redis 的字符串类型,字符串数据类型对应使用的指令包括 set、get、mset、incr、decr 等。
- string 内部的实现是通过 SDS(Simple Dynamic String ) 来存储的。SDS 可以通过预分配冗余空间的方式