数据结构与对象

  1. 简单动态字符串

    SDS simple dynamic string

    ads.h/adshdr

    image-20200611191443812

  1. 链表(双端链表)

    列表键的实现之一:列表健包含了数量较多的元素,或者列表中的元素是比较长的字符串

    adlist.h/listNode

    adlist.h/list

    image-20200611191731604

    image-20200611191938934

  2. 字典

    哈希键的实现之一:哈希键的键值对比较多,或者键值对中元素是比较长的字符串

    dict.h/dict

    dict.h/dictht 哈希表

    image-20200611192134108

    image-20200611192151751

    image-20200611192316123

  3. 跳跃表

    有序集合键的实现之一:包含元素数量多,或者有序集合中元素的成员(member)是比较长的字符串

    redis.h/zskiplistNode

    redis.h/zskiplist

    image-20200611192508163

  4. 整数集合

    集合键的实现之一:集合只包含整数值元素,并且数量不多

    intset.h/intset

    image-20200611192614681

  5. 压缩列表

    列表键和哈希键的底层实现之一:当列表键只包含少量列表项,并且每个列表项要么是小整数,要么是长度比较短的字符串

    ziplist

    image-20200611193109349

    image-20200611193129132

  6. 对象

    以上的数据结构都封装在对象中再使用

    包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象

    Redis根据对象的类型来判断一个对象是否可以执行给定的命令

    还实现了基于引用计数计数的内存回收机制,对象可共享

    image-20200611193700470

    type的枚举值

    image-20200611193737253

    encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现

    image-20200611193923869

    每种类型的对象都至少使用了两种不同的编码

    image-20200611194007998

    string: int / embstr / raw

    list: ziplist/ linkedlist 压缩列表或者链表

    (ziplist字符串元素长度小于64字节,元素个数小于512个)

    image-20200611194332923

    image-20200611194347437

    hash: ziplist / ht 压缩列表或者字典

    (ziplist键值对键和值的字符串长度都小于64字节&&键值对数量个数小于512个)

    image-20200611194553335

    image-20200611194609549

    set: intset / ht 整数集合或者字典

    (intset所有元素都是整数值&&个数小于512个)

    (使用字典时,值设置为NULL)

    image-20200611194904298

    zset: ziplist / skiplist 压缩列表或者跳跃表

    (ziplist所有元素成员的长度小于64字节&&个数小于128个)

    image-20200611195011400

    image-20200611195025054

    同时使用跳跃表和字典:跳跃表实现有序集合,方便范围操作;字典方便查找成员的分值

    image-20200611195122748

  7. 多态

    DEL、EXPIRE等命令和LLEN等命令的区别在于,前者是基于类型的多态——一个命令可以同时用于处理多种不同类型的键,而后者是基于编码的多态——一个命令可以同时用于处理多种不同编码(比如说list的ziplist和linkedlist都实现了LLEN)。

多机数据库

主从复制

主库读写,从库只读

Sentinel 哨兵

由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

image-20200612194739938

image-20200612194818742

image-20200612194838387

集群

集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。