一: 持久化
1. 什么是持久化
redis的所有数据保存在内存中, 对数据的更新将异步的保存到硬盘中
2. 实现持久化的方式
快照: 某时某刻数据的一个完成备份
mysql的Dump
redis的RDB
写日志: 任何操作记录到日志, 要恢复数据, 只要把日志重新走一片即可
mysql的Binlog
redis的AOF
二: RDB
1.触发机制的主要三种方式
'''save(同步)
1 客户端执行save命令----》redis服务端----》同步创建RDB二进制文件
2 会造成redis的阻塞(数据量非常大的时候)
3 文件策略:如果老的RDB存在,会替换老的
4 复杂度 o(n)'''
'''bgsave(异步,Backgroud saving started)
1 客户端执行save命令----》redis服务端----》异步创建RDB二进制文件(fork函数生成一个子进程(fork会阻塞reids),执行createRDB,执行成功,返回给reids消息)
2 此时访问redis,会正常响应客户端
3 文件策略:跟save相同,如果老的RDB存在,会替换老的
4 复杂度 o(n)'''
'''自动(通过配置)
配置 seconds changes
save 900 1
save 300 10
save 60 10000
如果60s中改变了1w条数据,自动生成rdb
如果300s中改变了10条数据,自动生成rdb
如果900s中改变了1条数据,自动生成rdb
以上三条符合任意一条,就自动生成rdb,内部使用bgsave'''
#配置:
save 900 1 #配置一条
save 300 10 #配置一条
save 60 10000 #配置一条
dbfilename dump.rdb #rdb文件的名字,默认为dump.rdb
dir ./ #rdb文件存在当前目录
stop-writes-on-bgsave-error yes #如果bgsave出现错误,是否停止写入,默认为yes
rdbcompression yes #采用压缩格式
rdbchecksum yes #是否对rdb文件进行校验和检验
#最佳配置
save 900 1save300 10save60 10000dbfilename dump-${port}.rdb #以端口号作为文件名,可能一台机器上很多reids,不会乱
dir /bigdiskpath #保存路径放到一个大硬盘位置目录
stop-writes-on-bgsave-error yes #出现错误停止
rdbcompression yes #压缩
rdbchecksum yes #校验
2. 触发机制
1 全量复制 #没有执行save和bgsave没有添加rdb策略,还会生成rdb文件,如果开启主从复制,主会自动生成rdb
2 debug reload #debug级别的重启,不会将内存中的数据清空
3 shutdown save#关闭会出发rdb的生成
三: AOF
1. RDB问题
耗时, 耗性能
不可控, 可能会丢失数据
2. AOF介绍
客户端每写入一条命令, 都会记录一条日志, 放到日志文件中, 如果出现宕机, 可以将数据恢复
3. AOF的三种策略
日志不是直接写到硬盘上, 而是先放到缓冲区, 缓冲区根据一些策略, 写到硬盘上
always: redis>>写命令刷新缓冲区>>每条命令fsync到硬盘>>AOF文件
everysec(默认值): redis>>写命令刷新缓冲区>>每秒把缓冲区fsync到硬盘>>AOF文件
no: redis>>写命令刷新缓冲区>>操作系统决定, 缓冲区fsync到硬盘>>AOF文件
命令alwayseverysecno
优点
不丢失数据
每秒一次fsync,丢失1秒数据
不用管
缺点
IO开销大,一般的sata盘只有几百TPS
丢1秒数据
不可控
4. AOF重写
随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
本质就是把过期的, 无用的, 重复的, 可以优化的命令, 来优化, 这样可以减少磁盘占用量, 加速恢复速度
原生AOFAOF重写
set hello world
set hello java
set hello hehe
incr counter
incr counter
rpush mylist a
rpush mylist b
rpush mylist c
过期数据
set hello hehe
set counter 2
rpush mylist a b c
4.1. 实现方式
bgrewriteaof: 客户端向服务端发送bgrewriteaof命令, 服务端会起一个fork进程, 完成AOF重新
5. AOF配置
appendonly yes #将该选项设置为yes,打开
appendfilename "appendonly-${port}.aof" #文件保存的名字
appendfsync everysec #采用第二种策略
dir /bigdiskpath #存放的路径
no-appendfsync-on-rewrite yes #在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失