Redis是一个内存数据库,效率比传统数据库效率要高得多,但是对极端情况(宕机断电)的防御性能就差了很多。Redis提供了两种持久化技术,一种是**RDB Snapshotting**,另一种是**AOF(append-only-file)**。
RDB
rdb快照技术就是将内存中的数据集保存下来。
- 三种保存方式:
- 自动触发
每过指定时间,根据规则进行自动保存。见配置文件 - save
该命令会阻塞当前Redis服务器,在save执行期间,Redis不能处理其他命令,直到快照完成为止。 - bgsave
在执行bgsave(background save)时,Redis会fork出一个子进程,由子进程来进行RDB,主进程可以仅需负责其他命令,子进程会在RDB完成的时候结束。
- 数据恢复
只需要将rdb文件放在redis安装目录中,启动Redis服务的时候就会自动载入rdb文件。
CONFIG GET dir
命令可以查看安装目录。
- 优缺点
优点:
- 在启用了压缩模式后,rdb文件十分节省内存。
- rdb恢复数据的速度更快.
缺点: - 可用性较差,可能会丢失部分数据,如自动保存间隔期间如果发生宕机,将失去期间数据。
- fork操作会占用一定的内存空间.
- 原理
struct redisService{
//1、记录保存save条件的数组
struct saveparam *saveparams;
//2、修改计数器
long long dirty;
//3、上一次执行保存的时间
time_t lastsave;
}
struct saveparam{
//秒数
time_t seconds;
//修改数
int changes;
};
redisService
中:
dirty
记录距离上次成功持久化之后,Redis服务器进行的修改次数。
lastsave
记录上次持久化的时间。
Redis 服务器还有一个周期性操作函数 severCron
,默认每隔 100 毫秒就会执行一次,该函数会遍历并检查 saveparams
数组中的所有保存条件,只要有一个条件被满足,那么就会执行 bgsave
命令。
执行完成之后,dirty
计数器更新为 0 ,lastsave
也更新为执行命令的完成时间。
AOF
AOF是将对键值对操作命令保存到文件中。
-
保存方式
开启AOF模式,其他配置请看配置文件。
默认是每秒执行一次aof,因此aof模式会厂商很难过大量IO操作。aof文件也会因为Redis不断写入越来越大。 -
bgrewriteaof
命令
主进程会fork出子进程,将内存中的数据重写成操作方式保存到aof文件中。这样可以一定程度压缩aof文件。
-
三种触发方式
- always 每次发生数据变更都进行同步
- everysec 每秒进行同步
- no 从不同步
- 优缺点
优点:
- 可靠性,最多丢失1秒数据
- aof文件更容易修复
- aof可读性好
缺点:
- aof文件体积大
- 在高负载情况下aof性能较差
- 官方指出aof存在一些bug
RDB&AOF
redis4.0相对与3.X版本其中一个比较大的变化是4.0添加了新的混合持久化方式。前面已经详细介绍了AOF持久化以及RDB持久化,这里介绍的混合持久化就是同时结合RDB持久化以及AOF持久化混合写入AOF文件。这样做的好处是可以结合
rdb 和 aof 的优点, 快速加载同时避免丢失过多的数据,缺点是 aof 里面的 rdb 部分就是压缩格式不再是 aof
格式,可读性差。作者:coding乐猿 链接:https://www.jianshu.com/p/446b12e4740f 来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
混合持久化的优缺点:
优点: 结合了RDB和AOF的有点,加载速度较快,同时数据可靠性更高.
缺点: 兼容性变差了,而且aof文件可读性变差了.