首页 > 技术文章 > 【阅读笔记】Redis

Brake 2020-11-22 19:06 原文

内存模型

  1. 内存划分

    1. 数据本身
    2. redis进程运行本身需要的内存
    3. 缓冲区
    4. 内存碎片
  2. 存储细节

    1. 数据模型

      1. dicEntry:每一个键值对(Key-Value)都会有一个dicEntry。
      2. Key:redis key,以SDS的格式存储
      3. redisObject:redis value,以redisObject的格式存储。
    2. jemalloc

      redis默认的内存分配器。

    3. 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;
      
    4. SDS

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

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

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

  3. 对象类型

    redis支持五种类型的数据。

    1. 字符串

      • redis最基础的类型,字符串的长度不能超过512MB
    2. 哈希

      • 哈希时redis支持的五种数据类型一直,redis作为key-value数据库本身所使用的数据结构
    3. 列表

      • 列表(list)用来存储多个有序的字符串,每个字符串称为元素;

      • 一个列表可以存储2^32-1个元素。

      • Redis中的列表支持两端插入和弹出,并可以获得指定位置(或范围)的元素,可以充当数组、队列、栈等。

    4. 集合

      • 集合(set)与列表类似,都是用来保存多个字符串;
      • 集合与列表有两点不同:集合中的元素是无序的,因此不能通过索引来操作元素;集合中的元素不能有重复。
      • 一个集合中最多可以存储2^32-1个元素;
      • 除了支持常规的增删改查,Redis还支持多个集合取交集、并集、差集。
    5. 有序集合

      • 有序集合与集合一样,元素都不能重复;
      • 但与集合不同的是,有序集合中的元素是有顺序的。
      • 与列表使用索引下标作为排序依据不同,有序集合为每个元素设置一个分数(score)作为排序依据。

持久化

持久化即备份,这是高可用的策略之一,有了备份,就可以在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):哨兵可以把故障转移结果通知给客户端。

架构

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

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

  2. 数据节点:主节点和从节点都是数据节点。

集群

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

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

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

阅读的博客:https://www.cnblogs.com/kismetv/category/1186633.html

推荐阅读