内存模型

  1. 内存划分
  1. 数据本身
  2. redis进程运行本身需要的内存
  3. 缓冲区
  4. 内存碎片
  1. 存储细节
  1. dicEntry:每一个键值对(Key-Value)都会有一个dicEntry。
  2. Key:redis key,以SDS的格式存储
  3. redisObject:redis value,以redisObject的格式存储。
  4. 数据模型
    【阅读笔记】Redis_集群
  5. jemalloc
    redis默认的内存分配器。
  6. RedisObject
    redis中的所有数据都是以RedisObject的形式存储的。

typedef struct redisObject {
  unsigned type:4;
  unsigned encoding:4;
  unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
  int refcount;
  void *ptr;
} robj;


  1. SDS
    SDS(Simple Dynamic String),Redis采用SDS来标识字符串

struct sdshdr {
int len;
int free;
char buf[];
};

  1. buf表示字节数组,用来存储字符串;len表示buf已使用的长度,free表示buf未使用的长度。下面是两个例子。
  1. 对象类型

redis支持五种类型的数据。


  • 有序集合与集合一样,元素都不能重复;
  • 但与集合不同的是,有序集合中的元素是有顺序的。
  • 与列表使用索引下标作为排序依据不同,有序集合为每个元素设置一个分数(score)作为排序依据。
  • 集合(set)与列表类似,都是用来保存多个字符串;
  • 集合与列表有两点不同:集合中的元素是无序的,因此不能通过索引来操作元素;集合中的元素不能有重复。
  • 一个集合中最多可以存储2^32-1个元素;
  • 除了支持常规的增删改查,Redis还支持多个集合取交集、并集、差集。
  • 列表(list)用来存储多个有序的字符串,每个字符串称为元素;
  • 一个列表可以存储2^32-1个元素。
  • Redis中的列表支持两端插入和弹出,并可以获得指定位置(或范围)的元素,可以充当数组、队列、栈等。
  • 哈希时redis支持的五种数据类型一直,redis作为key-value数据库本身所使用的数据结构
  • redis最基础的类型,字符串的长度不能超过512MB
  1. 字符串
  2. 哈希
  3. 列表
  4. 集合
  5. 有序集合

持久化

持久化即备份,这是高可用的策略之一,有了备份,就可以在Redis故障通过备份进行恢复。redis持久化主要有RDB和AOF。

  1. RDB
    RDB(Redis DataBase),基于策略定时将redis内存中的数据保存到硬盘。需要时可以通过这个备份文件进行恢复。
  2. AOF
    AOF(Append Only File),是把每次redis执行的命令记录到日志文件中(类似于MySql的Bin log),当Redis启动时可以通过执行log中的命令来恢复数据。

主从复制

主从复制,是把一台redis服务器上数据复制到其他服务器的机制,其中前者被称为主节点(master)。后者被称为从节点(slave)。

上面说的持久化是解决单机备份问题(内存到硬盘),主从复制主要解决数据在多机器之间的热备份,实现负载均衡和故障恢复。

主从复制的主要主要作用:

  1. 数据冗余:数据热备,多机备份。
  2. 故障恢复:当主节点出现问题时,可以让从节点提供服务,是一种功能的冗余。
  3. 负载均衡:可以让主节点写,从节点多,可以把压力分配到多个从节点,从而实现负载均衡。
  4. 高可用基石:主从复制时实现哨兵和集群的基础。

哨兵

哨兵,Redis sentinel,在主从复制的基础上实现故障恢复的自动化。其核心功能是主节点(master)的自动故障转移。

主要功能:

  1. 监控(Monitor):哨兵不断检查主节点和从节点是否正常工作
  2. 自动故障转移(Automatic failover):主节点不正常时,哨兵启动自动故障转移,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点从这个新的主节点复制数据。
  3. 配置提供着(Configuration provider):客户端可以通过哨兵来获取主节点地址。
  4. 通知(Notification):哨兵可以把故障转移结果通知给客户端。

架构:

【阅读笔记】Redis_哨兵_02

它由两部分组成,哨兵节点和数据节点:

  1. 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
  2. 数据节点:主节点和从节点都是数据节点。

集群

持久化实现了单机的备份,主从解决了多机的热备份,以及读的操作的负载均衡,最终通过哨兵实现了主节点的自动故障迁移。

目前还有一个核心问题,主节点只有一个,写操作只能写到一个节点,还没有实现负载均衡,存储能力完全受限于单机的存储能力。

集群就是用来解决写操作负载均衡的问题。其核心就是数据分片。集群将数据分散到不同的集群上,解决单机存储能力受限的问题。