redis持久化:redis为什么要持久化,数据在内存中如果遇到突然断电等突发情况,如果将数据往数据库存,会带来很大的压力,所有我们让redis将数据存在磁盘上减轻数据库负担。
有两种持久化方式:
1.RDB(Redis数据库):RDB持久性以指定的时间间隔执行数据集的时间点快照。(简单意思是就是每隔一段时间将内存的数据写到磁盘,保证数据不丢失,快照文件:dump.rdb)
时间间隔60秒后一万次修改,5分组后100次修改,1小时后1次修改就进行快照。
那么我们如果想手动保存怎么办呢?
save 和bgsave
但是使用save会阻塞redis服务,实际中千万不要用!!!
使用bgsave会产生子进程进行快照备份。
当我插入数据后,查看磁盘大小
未发生变化
当我手动存入数据时
dump.rdb文件大小变化。
但是在执行flushall/flushdb命令会产生dump.rdb文件,但里面是空的,所有也没有意义,所以也不能把备份文件和生产redis服务器放同一台机器,以免备份文件挂了
缺点:1.如果意外down掉,从现在到最近一次快照期间的数据会丢失,2.内存数据全量同步会降低效率,有大致2倍的膨胀性,需要考虑
禁用:如果想禁用rdb,可以有两种方法
1.命令:redis-cli config set save ""
2.配置文件: 将配置文件中的save ""注释取消并保存
配置文件rdb部分参数
表示如果当前快照出错是否停止写的操作,为了数据一致性默认是yes
表示磁盘存储的rdb快照是否压缩,默认是yes
redis对快照的数据是否进行效验
2.AOF(日志记录):aof会将所有写指令以日志形式记录下来,只许追加不许修改文件,重启会将日志文件内容写指令重新执行。
默认未开,需将配置文件修改:appendonly yes
工作流程
命令到达后----->先存入内存的AOF缓冲区保存,当命令达到一定量-------->写入磁盘,避免频繁IO操作-------->随着AOF的增加,会将命令等进行合并,起到压缩目的
aof从缓存区到磁盘三种方法
everysec 每秒写(默认)
always 每个命令完成即写(IO频繁)
no 操作系统决定
总结
redis7后AOF文件(分为3)
base:基础AOF,通过重写产生,只有一个。
incr:增量AOF,存增改命令的文件,可多个。
HISTORY:每次保存后,就会不需要当前缓存文件,所以变为历史文件。
在高并发使用AOF时,如果AOF正在记录而出现断电意外情况,就会导致incr文件乱码,可以通过redis-check-aof --fix进行修复(及将最后未写完的命令直接删除)
优点:使用AOF更加持久,数据恢复更可靠
缺点:文件相比rdb更大,恢复速度慢
启动AOF内容 压缩,只保留可恢复数据最小指令集。
比如
set k1 v1
set k1 v2
set k1 v3
在aof日志文件会只保留最后一个命令,降低文件占用空间
bgrewriteaof 手动触发aof重写机制
AOF重写机制:读取服务器现有键值对,直接通过新建命令保存该数据到新的AOF中,替换原来AOF文件。
aof和rdb持久化如果都开启,那么数据恢复是用哪个文件呢?
aof的优先级更高,及有aof文件就使用aof,没有就使用rdb文件数据恢复。
纯缓存模式,同时关闭aof和rdb,但可以手动保存,这个模式优点提高了效率。