Redis差别数据类型的的数据结构完毕

咱们清楚Redis支持种种数据类型,

个别是字符串、哈希表(map)、列表(list)、集合(set)和平稳聚集,和Java的聚合框架好像,差别数据类型的数目结构实也是不等同的。

1.Redis中的redisObject对象

Redis是选取C编写的,内部贯彻了三个struct结构体redisObject对象,

通过结构体来模仿面向对象编制程序的“多态”,作为贰个平底的多寡补助,redisObject代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
 * Redis 对象
 */
typedef struct redisObject {
    // 类型
    unsigned type:4;
    // 对齐位
    unsigned notused:2;
    // 编码方式
    unsigned encoding:4;
    // LRU 时间(相对于 server.lruclock)
    unsigned lru:22;
    // 引用计数
    int refcount;
    // 指向对象的值
    void *ptr;
} robj;

 

中间type、encoding、ptr贰性格格分别表示:
type:redisObject的类型,字符串、列表、集合、有序集、哈希表
encoding:底层完毕组织,字符串、整数、跳跃表、压缩列表等
ptr:实际指向保存值的数据结构

假若贰个 redisObject 的 type 属性为 REDIS_LIST , encoding 属性为
REDIS_ENCODING_LINKEDLIST ,

那就是说那些目的就是贰个 Redis 列表,它的值保存在3个双端链表内,而 ptr
指针就对准那么些双端链表;

假使二个 redisObject 的 type 属性为 REDIS_HASH , encoding 属性为
REDIS_ENCODING_ZIPMAP ,

那么那几个指标正是1个 Redis 哈希表,它的值保存在二个 zipmap 里,而 ptr
指针就对准那几个 zipmap 。

上面那张图纸中的REDIS_STRING/REDIS_LIST/REDIS_ZSET/REDIS_HASH/REDIS_SET针对的是redisObject中的type,
末端指向的REDIS_ENCODING_LINKEDLIST等针对的是encoding字段。

图片 1

Redis的平底数据结构有以下几种:

Redis的最底层数据结构有以下两种:
简简单单动态字符串sds(Simple Dynamic String)
双端链表(LinkedList)
字典(Map)
跳跃表(SkipList)

 

下边针对四种数据类型,学习有关的平底数据结构。

2.String

假诺三个String类型的value能够保留为整数,则将对应redisObject
对象的encoding修改为REDIS_ENCODING_INT,将对应robj对象的ptr值改为对应的数值。
只要不能够转为整数,保持原有encoding为REDIS_ENCODING_RAW。
从而String类型的多少大概采纳原来的字符串存储(实际为sds – Simple Dynamic
Strings,对应encoding为REDIS_ENCODING_RAW)可能整数存款和储蓄。

Redis可以一直查看对象的ENCODING值:

1
2
3
4
5
6
7
8
redis:6379> set strtest 1
OK
redis:6379> OBJECT ENCODING strtest
"int"
redis:6379> set strtest blog
OK
redis:6379> OBJECT ENCODING strtest
"raw"

  

3.List

列表的平底实现有2种:
REDIS_ENCODING_ZIPLIST
REDIS_ENCODING_LINKEDLIST
ZIPLIST比较LINKEDLIST能够节外省部存款和储蓄器,
当创制新的列表时,默许是应用压缩列表作为底层数据结构的。
Redis内部会对相关操作做判定,
当list的elem数小于配置值: hash-max-ziplist-entries
只怕elem_value字符串的长度小于 hash-max-ziplist-value, 能够编码成
REDIS_ENCODING_ZIPLIST 类型存款和储蓄,以节省里部存款和储蓄器;
但由于在zip list添加和删除成分会涉及到数码移动,
因而当list内容较多时,使用双向链表。

4.Hash

创办新的Hash类型时,私下认可也利用ziplist存款和储蓄value,保存数据过多时,使用hast
table。

5.Set

集合的底部完结也有三种:
REDIS_ENCODING_INTSET
REDIS_ENCODING_HT(字典)
开创Set类型的key-value时,借使value能够代表为整数,则选拔intset类型保存value。
数据量大时,切换为运用hash table保存各样value。

6.Sorted Set

一如既往聚集的底层完成也是2种:
REDIS_ENCODING_ZIPLIST
REDIS_ENCODING_SKIPLIST

至于Redis中的跳跃表,查看那篇文章:跳跃表
跳跃表在 Redis中的使用,就是促成稳步聚集数据类型。

相关文章