持久化就是把内存中的数据保存到硬盘

持久化的实现方式

  1. RDB

    优点:是一个紧凑压缩的二进制文件,数据恢复速度快,

    缺点:没法做到实时持久化,每次运行都要执行fork操作创建子进程,属于重量级操作,执行频繁成本过高,老版本的redis软件不兼容新版本RDB文件

  2. AOF

    实时地记录日志,不容易丢失数据

    redis自己的算法来看,哪些日志是无效的,比如:set k1 v1, DEL k1,那么这两条日志会自动被删除,来减少日志量

AOF和RDB同时存在的时候,启动reids服务端时,加载AOF

快照:某时刻数据的一个完整备份,
	-mysql的Dump
    -redis的RDB
写日志:任何操作都记录日志,要恢复数据,只要把日志重新走一遍即可
	-mysql的 Binlog
        -Redis的 AOF

RDB方式

触发机制
1. 手动执行:bgsave,该命令会生成一个子进程来做持久化的事情,父进程做自己原来的事
这种持久化,需要占用内存空间


# 2.配置文件中的RDB配置,满足以下条件之一,就执行持久化操作
save 900 1	# 900秒内至少一个key发生改变
save 300 10	# 300秒内至少10个key发生改变
save 60 10000

dbfilename dump-${port}.rdb  # 以端口号作为文件名,可能一台机器上很多reids实例,不会乱
dir /bigdiskpath # 保存路径放到一个大硬盘位置目录
stop-writes-on-bgsave-error yes #出现错误停止
rdbcompression yes #压缩
rdbchecksum yes #校验

SHUTDOWN # 关闭服务端,关闭之前先执行持久化操作
kill -9 redis # 执行这条命令,redis服务端被强行结束,不会执行持久化操作
kill  redis	# 执行这条命令,结束redis服务端时,会先执行持久化操作
kill,pkill, kill -15 这三个命令的效果:让进程先把事做完,再退出
kill -9 慎用

AOF方式及其三种策略

日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上

always:redis–》写命令刷新到缓冲区—》每条命令fsync到硬盘—》AOF文件

everysec(默认值):redis——》写命令刷新到缓冲区—》每秒把缓冲区fsync到硬盘–》AOF文件

no:redis——》写命令刷新到缓冲区—》操作系统决定,缓冲区fsync到硬盘–》AOF文件

命令 always everysec no
优点 不丢失数据 每秒一次fsync,丢失1秒数据 不用管
缺点 IO开销大,一般的sata盘只有几百TPS 丢1秒数据 不可控

# AOF配置
appendonly yes #将该选项设置为yes,打开
appendfilename "appendonly-${port}.aof" #文件保存的名字
appendfsync everysec #采用第二种策略
dir /bigdiskpath #存放的路径
no-appendfsync-on-rewrite yes #在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失

AOF重写的相关配置

  1)auto-aof-rewrite-percentage 100

  2)auto-aof-rewrite-min-size 64mb

这两个配置项的意思是,在aof文件体量超过64mb,且比上次重写后的体量增加了100%时自动触发重写。我们可以修改这些参数达到自己的实际要求