Redis如何做持久化
为什么要做redis持久化
redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
Redis如何做数据持久化
RDB(快照)持久化:保存某个时间点的全量数据快照
- 找到redis.conf文件
- 从文件中找到 save
- sava 900 1 在900s以内有一条是写入指令,则触发备份,产生一次快照
- save 300 10 在300s以内 如果有10 条写入,那么就会产生快照,如果变动数 > 0 还没有到10条则会等到90s以后才去做备份
- 当进程操作出现问题的时候,则停止写入操作,这样是为了保护持久化数据一致性
- 是将备份的文件压缩后再保存
备份文件 在src目录下,后缀名为.rdb
- SAVE :阻塞Redis的服务器进程,直到RDB文件被创建完毕
- BGSAVE:Fork出一个子进程来创建RDB文件,不阻塞服务器进程
自动化出发RDB持久化的方式
- 根据redis.conf配置中的SAVE m n 定时触发(用的是BGSAVE)
- 主从复制时,主节点自动触发
- 执行Debug Reload
- 执行Shutdown且没有开启AOF持久化
BGSAVE原理
fork:创建进程,实现了Copy-on-Write
Copy-on-Write : 如果有多个调用者同事要求相同资源,他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正的复制一份专用副本给该调用者,而其他调用者所见到的最初的资源任然不变
RDB持久化的缺点
- 内存数据的全量同步,数据量大会由于I/O而影响性能
- 可能会因为Redis挂掉而丢失从当前至最近一次快照期间的数据
AOF持久化:保存写状态
- 记录下除了查询意外的所有变更数据库状态的指令
- 以append的形式追加保存到AOF文件中
修改redis.conf文件
- 设置为yes即可生效
- appendfilename 生成的文件名
- 生成aof文件的额写入方式
- always:及时将缓存中的内容写入文件
- everysec:将缓存区中的内容每隔1s写入文件
- no :交由文件系统决定
日志重写解决AOF文件大小不断增大的问题,原理如下:
- 调用fork(),创建一个子进程
- 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
- 主进程持续将新的变动同事写到内存和原来的AOF里
- 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
- 使用新的AOF文件替换掉旧的AOF文件
Redis数据的恢复
RDB和AOF的优缺点
- RDB:
- 优点:全量数据快照,文件小,恢复块
- 缺点:无法保存最近一次快照之后的数据
- AOF
- 优点:可读性高,适合保存增量数据,数据不易丢失
- 缺点:文件体积大,恢复时间长
RDB-AOF混合持久化方式
- BGSAVE做镜像全量持久化,AOF做增量持久化