Code前端首页关于Code前端联系我们

Redis的持久化机制是什么:RDB和AOF

terry 2年前 (2023-09-26) 阅读数 49 #数据库

什么是Redis持久化?

Redis作为内存数据库中的键值对(NoSQL♻在内存中),存储数据。处理客户端请求时,所有操作都在内存中进行,如下图: 什么是Redis持久化机制:RDB和AOF

问题出在哪里?

其实稍微有点计算机基础知识的人都知道,只要服务器关闭(各种原因),内存中存储的数据就会丢失。不仅服务器关闭会导致数据丢失,Redis服务器守护进程退出,内存中的数据也会丢失。 什么是Redis持久化机制:RDB和AOF

对于只使用Redis作为缓存的项目来说,丢失数据可能并不是什么大问题。从数据源重新加载数据就可以了,但是如果直接加载用户发送的业务数据,Redis的内存数据丢失就会造成损坏。

为了防止数据在内存中丢失,Redis提供了持久化支持。我们可以选择不同的方式将数据从内存保存到硬盘,从而使数据得以保留。 什么是Redis持久化机制:RDB和AOF

Redis提供了两种不同的数据持久化方式:RDBAOF。下面我们来详细介绍一下这些不同的持久化方法。

RDB

RDB是一种快照存储持久化方法。具体来说,它将给定时间的Redis内存数据保存到硬盘上的文件中。默认保存的文件名为dump.rdb,当Redis服务器启动时,dump.rdb中的数据将被加载回内存。恢复数据。

激活 RDB 持久化模式

激活 RDB持久化模式非常简单。客户端可以将save发送到服务器Redis。 或 bgsave命令允许服务器生成rdb文件,或指定触发RDB配置文件条件。

1。 save 命令

save 命令是同步操作。

# 同步数据到磁盘上
> save 
复制代码
什么是Redis持久化机制:RDB和AOF

当客户端向服务器发送save命令请求持久化时,服务器会在save命令之后阻塞其他客户端的请求,直至数据同步完成。

如果数据量太大,数据同步会花费很长时间,期间Redis服务器将无法再接收任何请求。因此,生产环境中最好不要使用save命令。

2。 bgsave

与命令save 不同。命令 bgsave 是异步操作。

# 异步保存数据集到磁盘上
> bgsave
复制代码
什么是Redis持久化机制:RDB和AOF

NHEN 客户端发出命令bgsaveredihip主服务器进程会实现子进程解决数据同步问题,将数据保存到rdb文件中,子进程将退出。

因此,与save命令相比,Redis服务器正在处理bgsave,但它仍然可以接收进程bgsave,以及其他 叉子. 子进程是同步的,因此当forks子进程时,它们无法接受其他请求。这意味着如果forks子进程过多,执行时间过长就会被阻塞。其他客户的要求。

3。配置服务端自动触发

除了通过客户端发送命令之外,还有一种方式,就是在配置文件中指定持久化RDB触发器进来RedisRDB数据同步是基于一定条件开启的,比如【秒内至少要完成多少次写操作】。

例如,我们可以在redis.conf配置文件中指定以下选项:

# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000
复制代码

然后在启动服务器时加载配置文件。

# 启动服务器加载配置文件
redis-server redis.conf
复制代码

通过该服务器配置文件触发RDB的方法与bgsave命令类似。当满足触发条件时,会fork子进程来同步数据。不过最好不要通过这种方式触发RDB持久化,因为触发时间设置太短的话,很容易频繁写入RDB文件,影响服务器的性能。如果时间设置太长,数据将会丢失。

rdb文件

我们介绍了服务器生成rdb文件的三种方式,无论是由主进程还是子进程创建。流程如下:

  1. 生成临时rdb文件并写入数据。
  2. 完成数据写入,用临时文件替换官方rdb文件。
  3. 删除原来的db文件。

RDB生成的默认文件名为dump.rdb。当然,我可以通过配置文件进行更详细的配置。例如,在一台机器上启动多个redis服务器进程时,我可以通过端口号配置不同的rdb名称,如下所示:

# 是否压缩rdb文件
rdbcompression yes

# rdb文件的名称
dbfilename redis-6379.rdb

# rdb文件保存目录
dir ~/redis/
复制代码

RDB的几个优点

  1. 相比AOF方法,恢复数据更快。通过rdb文件。
  2. rdb文件非常紧凑,适合数据备份。
  3. 数据备份是通过RDB完成的。由于它是使用子进程生成的,因此对Redis服务器的性能影响较小。

RDB的一些缺点

  1. 如果服务器宕机,使用RDB会导致一定时间内的数据丢失。比如我们设置同步时间为10分钟或者5分钟同步1000次。写入同步一次。如果在达到触发条件之前服务器崩溃,则此时的数据将会丢失。
  2. 使用save命令会导致服务器阻塞,直到数据同步完成后才能接受后续请求。
  3. 对子fork进程使用bgsave命令时,如果数据量太大,fork进程也会被阻塞。另外,fork的子进程也会消耗内存。

AOF

说完RDB,我们再来说说Redis♻:Apk ly文件)

RDB 不同,后者保存特定时间的快照。持久化方式AOF记录从客户端到服务端的每一条写操作命令,并将写操作记录为协议Redis

附加并存储在文件末尾aof。当Redis服务器重启时,会加载并运行命令文件aof,以达到数据恢复的目的。 什么是Redis持久化机制:RDB和AOF

启用 AOF 持久化

Redis 默认情况下不启用 AOF 持久化。我们可以在配置文件中启用它,并进行更详细的配置,比如下面的redis.conf文件:

# 开启aof机制
appendonly yes

# aof文件名
appendfilename "appendonly.aof"

# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always

# 默认不重写aof文件
no-appendfsync-on-rewrite no

# 保存目录
dir ~/redis/
复制代码

三种写入策略

在上面的配置文件中,我们可以通过选项来指定写入策略追加fsync。有三个选项

appendfsync always
# appendfsync everysec
# appendfsync no
复制代码
1。 Always

客户端的每次写操作都存储在文件 aof中,这种策略很安全,但是每次写操作都包含IO操作,所以也很慢。

2。默认写入策略 everysec

appendfsync 每秒写入一次文件 aof,因此数据最多可能丢失 1 秒。

3。 no

Redis服务器不负责写入aof,而是在写入文件aof时交给操作系统来处理。更快,但也是最安全的选择,不推荐。

AOF 文件重写

AOF 将客户端的每次写操作追加到文件末尾aof,例如在按钮上多次执行 incr 命令。此时,aof将每条命令都保存到aof文件中,aof文件会很大。

incr num 1
incr num 2
incr num 3
incr num 4
incr num 5
incr num 6
...
incr num 100000
复制代码

aof 文件太大。打开aof文件恢复数据时,会很慢。为了解决这个问题,Redis支持aof文件重写。通过重写aof,可以生成一个最小的命令集来恢复当前的数据,如上面例子中有很多命令,可以重写为:

set num 100000
复制代码

aof文件是一个二进制文件。它并不像上面的例子那样直接保存每个命令,而是使用自己的Redis格式。以上仅用于演示目的。

两种重写方式

可以通过redis.conf配置文件中的no-appendfsync-on-rewrite选项设置是否启用重写。该方法会重写每次fsync时间,影响服务器的性质,所以默认值不是也不推荐。

# 默认不重写aof文件
no-appendfsync-on-rewrite no
复制代码

客户端向服务器发送bgrewriteaof命令,也可以让服务器进行AOF重写。

# 让服务器异步重写追加aof文件命令
> bgrewriteaof
复制代码

AOF重写方式也是一种异步操作,即如果要写入aof文件,Redis主进程会创建一个子进程来处理,如下图: 什么是Redis持久化机制:RDB和AOF

aof文件重写的好处
  1. 压缩aof文件,减少磁盘使用。
  2. 将aof命令压缩成最小命令集,加快数据恢复速度。

AOF文件损坏

在写入aof日志文件时,如果Redis服务器宕机,aof日志文件会出现格式错误。当Redis服务器重新启动时,Redis服务器将拒绝打开aof文件。您可以按照以下步骤修复aof并恢复数据。

  1. 现在备份aof文件,以防万一。
  2. 使用redis-check-aof命令修复aof文件。命令格式如下:
# 修复aof日志文件
$ redis-check-aof -fix file.aof
复制代码
  1. 重启Redis服务器,加载修复后的aof文件,恢复数据。

AOF的优点

AOF只增加日志文件,因此对服务器性能影响较小,比RDB更快,占用内存更少。

AOF 的缺点

  1. AOF 方法创建的日志文件非常大。即使经过AFO重写后,文件大小仍然很大。
  2. 返回数据比RDB慢。

选择RDB还是AOF?

通过上面的介绍,我们知道了RDB和AOF的优缺点。如何选择?

通过下面的表示,我们可以从几个方面来比较RDB和AOF。应用时应根据实际需要选择RDB或AOF。事实上,如果你希望你的数据非常安全,你可以使用这两种方法。是启用的,但是两种方法同时连续进行IO操作会影响服务器的性能,所以有时候你必须做出选择。 什么是Redis持久化机制:RDB和AOF

当RDB和AOF同时启用时,Redis会优先使用AOF日志来恢复数据,因为AOF存储的文件比RDB文件更完整。

总结

以上是关于持久化机制的大量知识Redis。其实,如果你只使用Redis作为缓存服务器,则无需考虑。不过,坚持下去,在目前大多数服务器架构中,Redis只起到缓存服务器的作用,也可以作为数据库来存储我们的业务数据。在这一点上,我们应该更加了解。关于Redis持久化策略的区别和选择。

作者:张俊红
链接:https://juejin.im/post/5d09a9ff51882577eb133aa9
来源:掘金商业转载请联系作者授权。非商业转载请注明出处。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门