Redis的持久化介绍及其Linux配置介绍

1. Redis的持久化

Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用.

  1. rdb持久化方式: 是在指定的时间间隔写入硬盘
  2. aof持久化方式:是以日志,记录每一个操作,服务器启动后,根据日志来构建数据.

Redis支持两种方式的持久化,一种是RDB方式(默认),一种是AOF方式。可以单独使用其中一种或将二者结合使用。

1.1 redis持久化之RDB方式

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照(snapshot)。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

1.1.1 执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令
  • 执行bgsave命令
  • Redis停机时
  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:

save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

2)bgsave命令

下面的命令可以异步执行RDB:

这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB

save 900 1

save 300 10

save 60 10000

1.1.2 RDB原理

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模的快照,且处于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.RDB的缺点就是最后一次持久化后的数据可能丢失.

具体流程如下:

  1. redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令;

  2. 主进程判断当前是否已经存在正在执行的子进程,如果存在,那么主进程直接返回;

  3. 如果不存在正在执行的子进程,那么就 fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完成后主进程即可执行其他操作;

  4. 子进程先将数据写入到临时的rdb文件中,待快照数据写入完成后再原子替换旧的 rdb文件;

  5. 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

RDB方式是redis默认支持的,总结如下:

  1. 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能

  2. 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效

  3. RDB 的缺点是最后一次持久化后的数据可能丢失

1.1.3配置方法

1.2 redis持久化之AOF方式

AOF: 以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(不会记录读指令),只许追加文件但是不可以改写文件,redis启动之初会读取该文件(appendonly.aof)重新构建数据,换而言之:redis重启的话就是根据日志文件的内容将写指令从头到尾执行一次,以完成数据的恢复工作.

解读上图

  1. 客户端的请求写命令会被 append 追加到 AOF 缓冲区内

  2. AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件 中

  3. AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量

  4. Redis 服务重启时 ,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的

AOF方式,以日志记录每一个操作。Redis可以通过日志去还原数据。

优势: 安全性相对RDB方式高很多,它记录了每一个操作

劣势:效率相对于RDB方式低很多。

Redis默认是关闭AOF方式的。

我们查看redis的配置文件,找到下图的位置:

appendonly no 默认关闭aof方式,我们修改为yes就开启

appendfilename 就是aof方式的日志文件

再往下拉:

上图的配置是aof的三种同步策略:

always 同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

everysec 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案

no 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘

三种策略对比:

1.2.1 aof重写机制

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

如图,AOF原本有三个命令,但是set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。

所以重写命令后,AOF文件内容就是:mset name jack num 666

原理

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

触发条件

在 APPEND ONLY MODE模块下有两条默认配置:

这两条配置就是触发重写aof文件的条件,第一个表示文件大小达到前一次保存文件的一倍,第二个表示aof文件大小最少达到64MB,两个条件必须同时满足。

3.3 RDB与AOF对比

3.3.1 RDB

采用的是快照机制进行的持久化

优点

  • RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份
  • ==RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快(因为其文件要比AOF的小)==
  • ==RDB的性能要比AOF更好==

缺点

  • ==RDB的持久化不够及时(一定时间间隔),可能会存在数据丢失,不便于数据库的重构(因为是快照的某一时刻最终结果,不清楚数据的变化过程)==
  • RDB持久化时如果文件过大可能会造成服务器的阻塞,停止客户端请求

3.3.2 AOF

采用append模式,不断的记录数据的变化过程

优点

  • ==AOF的持久性更加的耐久(可以每秒 或 每次操作保存一次)==
  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松,数据几乎不会丢失,便于数据库的重构。
  • AOF是增量操作

缺点

  • ==对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积,而且AOF文件只会越来越大(即使是删除命令也会被记录)==
  • ==根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB.==
相关推荐
小蜗牛慢慢爬行几秒前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger4 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud26 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡28 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷30 分钟前
Redis
数据库·redis·缓存
别这么骄傲1 小时前
lookup join 使用缓存参数和不使用缓存参数的执行前后对比
缓存
仰望大佬0071 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名1 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪1 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb