李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Redis持久化操作
Leefs
2020-03-16 PM
2616℃
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集合相关知识总结
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
MyBatis
Java
SQL练习题
序列化和反序列化
微服务
FileBeat
字符串
Hive
Spark Core
工具
Java阻塞队列
Java工具类
算法
Typora
Azkaban
查找
SpringBoot
Yarn
Elastisearch
Ubuntu
数学
Golang基础
数据结构
数据结构和算法
Spark Streaming
MyBatis-Plus
nginx
pytorch
Tomcat
VUE
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭