Redis_基本特性及原理

1/18/2021 Redis

# Redis基本特性及原理

# IO模型

Redis采用Epoll的IO模型,epoll的原理详见系统IO的章节

# 二进制安全

Redis进程与客户端进行交互的时候,存取的是字节流。目的是保证数据不被破坏

set k1 中    // 默认shell连接方式是utf8
strlen k1   // 结果 3
set k2 中   // 修改shell连接方式为gbk
strlen k2  // 结果 2 
1
2
3
4

# 数据库

  • Redis默认准备了16个库,(id为 0-15)

  • 库的选择

    • 连接后使用select命令选择使用哪个库

      select id
      
      1
    • 连接时指定

      redis-cli -n id
      
      1

# 单机持久化

# RDB

  • 原理

    执行持久化时Redis会fork()一个子进程来执行持久化。在执行fork的时候操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork那一刻的内存数据

    • fork()

      系统调用

    • cow( copy on write)

      写时复制,内核机制

  • 如何触发

    • save命令

      关机维护

    • bgsave命令

    • 配置文件save

      实际使用的bgsave

      配置方法

      • save 时间(秒) 操作数

        如:save 900 1

      • 关闭配置

        save '',或者直接删除

      • 配置文件

        dbfilename dump.rdb

      • 路径

        dir /var/lib/redis/6379

  • 弊端

    • 不支持拉链,只存在一个rdb文件

    • 丢失数据相对多一些

      时点与时点之间窗口数据容易丢失

  • 优势

    类似java中的序列化恢复的速度相对快

# AOF

  • 原理

    • Redis写操作记录到文件中

    • RDB和AOF可以同时开启

      • 如果开启了AOF只会用AOF恢复
      • 4.0以后AOF中包含RDB全量,增加记录新的写操作
  • 弊端

    • 体量无限变大,恢复慢

      • hdfs,fsimage+edits.log 让日志只记录增量合并的过程

      • 4.0以前-->重写

        删除抵消的命令,合并重复的命令,最终也是一个纯指令的日志文件

      • 4.0以后-->重写

        • 将老的数据RDB到AOF文件中
        • 将增量的以指令的方式Append到AOF中
    • 文件写会触发IO,存在丢失buffer数据的问题

      append only mode

      • 配置刷盘的频率
        • appendfsync always
        • appendfsync everysec
        • appendfsync no
  • 优势

    • 丢数据少
    • 4.0以后的AOF是一个混合体,利用了RDB的快也利用了日志的全量
  • 什么时候触发合并bgrewriteaof

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    1
    2

    redis在一次重写万之后会记录这次重写后aof大小,如果之前没有记录就以当前aof大小为准。在下次做readonlysync时判断aof文件增长比例,指当前aof文件比上次重写的增长比例大小。如果大于这个比例就触发重写。

  • 实操验证

    • readonly.aof文件内容协议

      *2
      $6
      SELECT
      $1
      0
      *3
      $3
      set
      $2
      k1
      $1
      1
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      • *2

        该条指令包含两个元素 select 0

      • $6

        元素包含6个字符

    • redis-check-rdb dump.rdb

      验证rdb文件的完整性

    • bgrewriteaof