RDB(默认)
RDB是通过快照方式完成的,当满足一定条件时,redis会自动将内存中的数据持久化到磁盘 。
触发快照的时机
- 符合自定义配置的快照规则 。(在redis.conf中配置,下面会详细介绍)
- 执行save或者bgsave命令
- 执行flushall命令
- 执行主从复制操作(第一次)
- 在快照进行的过程中,也就是生成文件的过程中,不会对原有的rdb文件进行修改,直到快照生成完毕,直接将老的替换成新的,保证rdb文件任何时刻都是完整的 。
- 我们可以通过定时备份rdb文件来实现redis数据的备份,rdb是压缩的二进制文件,占用空间小,有利于传输
例如:save 100 1:在100秒内,至少有一个键被修改就进行快照;save 200 4:在200秒内,至少4个键被修改就进行快照 。
RDB的优缺点
- 缺点:使用RDB进行持久化,在redis突然异常退出的时候,会丢失最后一次快照之后的数据 。但是,可以根据组合设置自动快照的方式,降低数据损失,确保在接受范围内 。如果数据较为重要,可以使用AOF方式
- 优点:使用RDB方式可以最大化redis性能,在快照过程中,我们可以看到主进程只需要fork出一个子进程即可,剩下的工作全部由子进程完成,父进程无需进行任何的磁盘I/O操作 。但是,如果数据集较大,在fork子进程的时候比较耗时,会导致redis在一段时间内停止处理请求 。
AOF配置方式
# 开启appendonly参数appendonly true# 设置AOF文件位置dir ./# 设置AOF文件名称,默认是appendonly.aofappendfilename appendonly.aof<br data-filtered="filtered">
RESP协议
Redis客户端使用RESP协议与Redis服务端进行通信,该协议是专门为redis设计的,但是也可以用于其他C-S项目 。
- 间隔符号:在linux中是rn,在windows中是n
- 简单字符串以'+'开头
- 错误Errors,以'-'开头
- 整数类型Integer,以':'开头
- 大字符串以'$'开头
- 数组类型Arrays,以'*'开头
- 命令传播
- 缓存追加
- 文件写入和保存
缓存追加
AOF程序接收到命令参数之后,会将其从字符串对象转换成协议内容,再将协议内容追加到AOF缓存中 。AOF缓存是在redisServer结构的aof_buf中,新的内容会被追加到aof_buf末尾 。aof_buf保持着所有未被写入到AOF文件的协议文本 。
文件写入和保存
将AOF缓存内容写入到AOF文件,并保持到磁盘 。当服务器的常规函数被执行,或者事件处理器被执行的时候,flushAppendOnlyFile函数将会被执行 。会有以下两个过程 。
- WRITE:将AOF缓存中的内容写入到AOF文件
- SAVE:调用fsync或者fdatasync函数,将AOF文件保存到磁盘中
- AOF_FSYNC_NO:不保存 。在这种模式下,每次调用flushAppendOnlyFile函数,write会被执行,而save会被忽略 。而save只有在以下三种条件下会触发,redis关闭,aof功能关闭,系统的写缓存被刷新(可能是缓存满了,或者定期执行保持操作) 。这三种情况下执行save操作会引起redis主线程的阻塞 。
- AOF_FSYNC_EVERYSEC(默认):每秒保存一次 。save每秒被执行一次,但是save由后台子线程完成,不会导致redis主线程阻塞 。
- AOF_FSYNC_ALWAYS:每执行一个命令保存一次 。这种情况下,每执行一个命令write和save都会被执行,而且save操作由主线程完成,会导致redis的阻塞 。安全性较高,性能较差,因此不推荐使用 。
推荐阅读
- 读完这篇文章,就基本搞定了Redis数据库
- 彻底理解Redis持久化
- redis各类型数据结构和底层实现源码分析
- 利用openresty+lua+redis 实现封杀频繁恶意访问IP地址
- Redis消息队列发展历程
- 职业教育|深化服务体系,积极探索航空职业教育发展
- 使用Docker搭建Redis-cluster环境
- Redis服务安全加固的说明
- Redis缓存知识问题
- Linux下php安装Redis扩展的方法