redis常见的数据类型及其底层结构和应用场景
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(简单动态字符串)表示
列表可以是压缩列表或者是双端链表
哈希可以是压缩列表或者是字典
集合可以是整数集合或者是字典
有序集合可以是压缩列表或者是跳表
对于底层数据结构的详细介绍在这里