李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Redis持久化操作
Leefs
2020-03-16 PM
2022℃
1条
# Redis持久化操作 ### 一、什么是Redis持久化 Redis把内部数据以文件形式在硬盘中保存一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)里,数据保存到硬盘的过程称为“持久化”效果。 ### 二、Redis实现持久化的方式 **redis有两种持久化功能:** **RDB(快照持久化):**默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合使用该持久化 **AOF(AOF持久化):**记录redis的操作日志,将redis执行过的命令(增/删/改)记录下载,当我们需要数据恢复时,redis去重新执行一次日志文件中的命令。开启AOF持久化会清空内部的数据,最好在使用之前就开启它。 ### 三、RDB和AOF持久化优缺点 **RDB持久化优势:** 1.文件实现的数据快照,全量备份,便于数据的传输。 2.文件采用压缩的二进制文件,当重启服务时加载数据文件,比AOF方式快 **劣势:** 1.rbd采用加密的二进制格式存储文件,由于Redis各个版本之间的兼容性问题也导致无法再其他的Redis版本中使用. 2.时效性差,容易造成数据的不完整性.因为rdb并不是实时备份,当某个时间段Redis服务出现异常,内存数据丢失,这段时间的数据是无法恢复的,因此易导致数据的丢失. **AOF持久化优势:** 可读性高,适合保存增量数据,数据不易丢失。 **劣势:** 文件体积大,恢复时间长。 ### 四、持久化命令操作 #### 1.RDB持久化操作 RDB持久化会在某个特定的间隔保存那个时间点的全量数据的快照。 **redis.cof**配置文件: ```java save 900 1 #在900s内如果有1条数据被写入,则产生一次快照。 save 300 10 #在300s内如果有10条数据被写入,则产生一次快照 save 60 10000 #在60s内如果有10000条数据被写入,则产生一次快照 stop-writes-on-bgsave-error yes #stop-writes-on-bgsave-error : 如果为yes则表示,当备份进程出错的时候, 主进程就停止进行接受新的写入操作,这样是为了保护持久化的数据一致性的问题。 ``` ##### RDB的创建与载入 > + **SAVE**:阻塞Redis的服务器进程,直到RDB文件被创建完毕。SAVE命令很少被使用,因为其会阻塞主线程来保证快照的写入,由于Redis是使用一个主线程来接收所有客户端请求,这样会阻塞所有客户端请求。 > + **BGSAVE**:该指令会Fork出一个子进程来创建RDB文件,不阻塞服务器进程,子进程接收请求并创建RDB快照,父进程继续接收客户端的请求。子进程在完成文件的创建时会向父进程发送信号,父进程在接收客户端请求的过程中,在一定的时间间隔通过轮询来接收子进程的信号。我们也可以通过使用**lastsave**指令来查看bgsave是否执行成功,lastsave可以返回最后一次执行成功bgsave的时间。 ##### 自动化触发RDB持久化的方式 1.根据redis.conf配置里的SAVE m n 定时触发(实际上使用的是BGSAVE) 2.主从复制时,主节点自动触发。 3.执行Debug Reload 4.执行Shutdown且没有开启AOF持久化。 ![Redis持久化操作01.png][1] (1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果存在bgsave命令直接返回。 (2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒 (3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。 (4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后 对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项 (5)进程发送信号给父进程表示完成,父进程更新统计信息,具体见 info Persistence下的rdb_*相关选项。 #### 2.开启AOF持久化 AOF的工作流程操作: ![Redis持久化操作02.png][2] 1. 打开redis.conf配置文件,将appendonly属性改为yes。 2. 修改appendfsync属性,该属性可以接收三种参数 分别是always,everysec,no, **always**:表示总是即时将缓冲区内容写入AOF文件当中。 **everysec**:表示每隔一秒将缓冲区内容写入AOF文件 **no**:表示将写入文件操作交由操作系统决定。 一般来说,操作系统考虑效率问题,会等待缓冲区被填满再将缓冲区数据写入AOF文件中。 ```java appendonly yes #appendfsync always appendfsync everysec # appendfsync no ``` ##### 日志重写解决AOF文件不断增大的问题 随着写操作的不断增加,AOF文件会越来越大。假设递增一个计数器100次,如果使用RDB持久化方式,我们只要保存最终结果100即可,而AOF持久化方式需要记录下这100次递增操作的指令,而事实上要恢复这条记录,只需要执行一条命令就行,所以那一百条命令实际可以精简为一条。Redis支持这样的功能,在不中断前台服务的情况下,可以重写AOF文件,同样使用到了COW(写时拷贝)。 重写过程如下: 1.调用fork(),创建一个子进程。 2.子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件。 3.主进程持续将新的变动同时写到内存和原来的AOF里。 4.主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动。 5.使用新的AOF文件替换掉旧的AOF文件。 *附:参考文件链接* *https://www.jianshu.com/p/d3ba7b8ad964* [1]: https://lilinchao.com/usr/uploads/2020/03/407733888.png [2]: https://lilinchao.com/usr/uploads/2020/03/815897097.png
标签:
Redis
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/732.html
上一篇
OpenFeign简介
下一篇
Java集合相关知识总结
取消回复
评论啦~
提交评论
唉呀 ~ 仅有一条评论
张大帅哥
好久没来, 来逛逛
回复
2020-03-19 00:07
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
43
标签云
VUE
Docker
HDFS
LeetCode刷题
高并发
持有对象
Sentinel
Azkaban
二叉树
MySQL
JavaScript
查找
递归
Kibana
Quartz
MyBatis
Flink
并发编程
Redis
Zookeeper
Livy
容器深入研究
Linux
JVM
人工智能
Shiro
Http
工具
Spark Core
Jquery
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
好久没来, 来逛逛