redis 数据持久化
Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB持久化 RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 手动触发数据持久化
手动触发分别对应save和bgsave:
- save指令:阻塞当前redis服务器,直到RDB过程完成为止(线上不建议使用,阻塞时间过长)。
- bgsave指令:redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动退出(阻塞只发生在fork截断)。当手动执行bgsave指令时,Redis父进程会判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。若没有,则会fork出子进程,fork操作过程中父进程会阻塞,通过info stat命令可以查看latest_fork_userc选项,可以获得最近一个fork操作的耗时,单位为微秒。父进程fork完成后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。进程发送信号给父进程表示完成,父进程更新统计信息。
示例如下:
127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379>
# 持久化的数据存放目录及文件名取决于配置文件中以下几个配置:
dbfilename dump.rdb # 定义数据持久化的文件名
dir /usr/local/redis/data # 定义数据持久化的文件存放目录
[root@redis data]# ll /usr/local/redis/data # 以下就是dump.rdb文件存放目录
总用量 28
-rw-r--r-- 1 root root 725 3月 9 14:15 dump.rdb
在每次redis启动时,都会去指定目录下寻找dump.rdb文件并读取它,把其中的数据读取到redis中,这是它可以做到数据持久化的根本原因。 自动触发数据持久化
四种自动触发的情况:
- 在配置文件中定义在m秒内数据发生多少次改变,自动触发bgsave。
- 如果从节点执行全量复制操作,主节点自动执行bgsave,形成RDB的文件发送到其他节点。
- 执行debug reload命令重新加载redis时,也会自动触发save操作。
- 执行shutdown时,如果AOF持久化没有开启,则自动执行bgsave。
配置文件中与RDB相关的配置如下:
#以下三行是数据持久化的策略,若要停止数据持久化,只需将其都注释掉即可。
# 以下同步策略可以自行根据线上情况更改
save 900 1 # 每900秒(15分钟)如果有1个key发生变化,则保存
save 300 10 # 每300秒(5分钟)如果有10个key发生变化,则保存
save 60 10000 # 每60秒(1分钟)如果有10000个key发生变化,则保存
dbfilename dump.rdb # 保存的文件名
dir /usr/local/redis/data # 文件的存放路径
下面的默认值为yes,当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这可以让我们意识到数据没有正确持久化到磁盘上,否则我们不会注意到灾难的发生了。如果redis重启了,那么有可以重新开始接受数据了。
stop-writes-on-bgsave-error yes
# 该值为yes的话,在redis持久化数据到磁盘时如果出现失败,redis会停止接受所有的写请求。
下面的选项默认值为yes,表示对于存储到磁盘中的快照数据,是否进行压缩存储。
rdbcompression yes
下面的选项默认值为yes,表示在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样会增加大约10%的性能消耗,如果希望可以获取到最大的性能提升,可以关闭该功能。
rdbchecksum yes
AOF数据持久化 相关参数如下:
appendonly no # 默认关闭aof持久化方式,将其设置为yes可以开启aof持久化
默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendfilename "appendonly.aof" # aof文件名
# appendfsync always
appendfsync everysec
# appendfsync no
上面三行是aof方式的持久化策略:
- always:表示每次写入都执行fsync,以保证数据同步到磁盘,但会影响性能,线上不建议采用
- everysec:表示每秒执行依次fsync操作,也就是说一旦宕机最多丢失1秒的数据,如果对数据不是那么敏感,建议采用这种方式。
- no:表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。但线上不建议采用,因为最长的同步周期可能有30s。
auto-aof-rewrite-percentage 100
aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
auto-aof-rewrite-min-size 64mb
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写,默认这个值为64M,生产中根据实际情况,可能会指定为几个G。
- WCF服务端运行时架构体系详解[下篇]
- python和C语言混编的几种方式
- 通过“四大行为”对WCF的扩展[实例篇]
- 古中国数学家的计算力真是惊人
- 基于Apache Spark机器学习的客户流失预测
- 数据库连接字符串的处理方法!加密解密连接字符串。
- ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI。
- 通过自定义ServiceHost实现对WCF的扩展[实例篇]
- 通过自定义ServiceHost实现对WCF的扩展[原理篇]
- python使用rsa库做公钥解密(网上别处找不到)
- 通过“四大行为”对WCF的扩展[原理篇]
- WCF客户端运行时架构体系详解[下篇]
- WCF客户端运行时架构体系详解[上篇]
- WCF服务端运行时架构体系详解[续篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- flink实战教程-使用set实时计算当天网站uv
- 贪心-HDU3348 coins(钱币问题)
- 归并排序详解 -HDU4911 Inversion(逆序对)
- 数据结构与算法——稀疏数组
- Maven安装配置详细教程
- 数据结构与算法——冒泡排序
- MyBatis Generator逆向工程-你还在手写mapper吗?
- JSR303后端校验详解
- SSM整合开发实战 SSM-MALL
- SQL Server获取元数据所有方法和示例
- 数据结构与算法——选择排序
- SmtpJS发送邮件教程
- 数据结构与算法——队列
- 前后端数据交互-json 你还不会传集合吗?
- 动态规划-背包问题(01背包、完全背包、多重背包)