梁越

redis常见的数据类型及其底层结构和应用场景

0 人看过

redis知识归纳

redis有如下几种数据类型

类型常量 对象
REDIS_STRING 字符串对象
REDIS_LIST 列表对象
REDIS_HASH 哈希对象
REDIS_SET 集合对象
REDIS_ZSET 有序集合对象

对于redis保存的键值来说,键总是一个字符串对象,值可以是其他类型

每种类型其实不仅限于一种数据结构,例如哈希集合有压缩列表的实现,也有哈希表的实现,这个取决于编码类型encoding

不同的编码类型对应不同的数据结构

编码类型 底层数据结构
REDIS_ENCODING_INT long类型的整数
REDIS_ENCODING_EMBSTR embstr编码的简单动态字符串(SDS)
REDIS_ENCODING_RAW 简单动态字符串(SDS)
REDIS_ENCODING_HT 字典
REDIS_ENCODING_LINKEDLIST 双端链表
REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_ENCODING_INTSET 整数集合
REDIS_ENCODING_SKIPLIST 跳表和字典

而每种对象会对应不止一种编码方式

如下表:

类型常量 编码方式 底层数据结构
REDIS_STRING REDIS_ENCODING_INT 使用整数实现的字符串
REDIS_STRING REDIS_ENCODING_EMBSTR 使用embstr编码的SDS实现的字符串
REDIS_STRING REDIS_ENCODING_RAW 使用SDS实现的字符串
REDIS_LIST REDIS_ENCODING_ZIPLIST 使用压缩列表实现的列表
REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端链表实现的列表
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 使用跳表和字典实现的有序集合

总结

如果一个字符串用来表示整数的时候,保存的形式是long,会将字符串转化为整型保存
其他情况字符串一般是使用SDS(简单动态字符串)表示

列表可以是压缩列表或者是双端链表

哈希可以是压缩列表或者是字典

集合可以是整数集合或者是字典

有序集合可以是压缩列表或者是跳表

对于底层数据结构的详细介绍在这里