持久化就是把内存中的数据保存到硬盘
持久化的实现方式
-
RDB
优点:是一个紧凑压缩的二进制文件,数据恢复速度快,
缺点:没法做到实时持久化,每次运行都要执行fork操作创建子进程,属于重量级操作,执行频繁成本过高,老版本的redis软件不兼容新版本RDB文件
-
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%时自动触发重写。我们可以修改这些参数达到自己的实际要求
浙公网安备 33010602011771号