Redis的持久化机制是什么:RDB和AOF
什么是Redis持久化?
问题出在哪里? 其实稍微有点计算机基础知识的人都知道,只要服务器关闭(各种原因),内存中存储的数据就会丢失。不仅服务器关闭会导致数据丢失, 对于只使用 为了防止数据在内存中丢失, 激活 当客户端向服务器发送 如果数据量太大,数据同步会花费很长时间,期间Redis服务器将无法再接收任何请求。因此,生产环境中最好不要使用 与命令 NHEN 客户端发出命令 因此,与 除了通过客户端发送命令之外,还有一种方式,就是在配置文件中指定持久化RDB触发器进来 例如,我们可以在redis.conf配置文件中指定以下选项: 然后在启动服务器时加载配置文件。 通过该服务器配置文件触发RDB的方法与bgsave命令类似。当满足触发条件时,会fork子进程来同步数据。不过最好不要通过这种方式触发RDB持久化,因为触发时间设置太短的话,很容易频繁写入RDB文件,影响服务器的性能。如果时间设置太长,数据将会丢失。 我们介绍了服务器生成rdb文件的三种方式,无论是由主进程还是子进程创建。流程如下: RDB生成的默认文件名为dump.rdb。当然,我可以通过配置文件进行更详细的配置。例如,在一台机器上启动多个redis服务器进程时,我可以通过端口号配置不同的rdb名称,如下所示: 说完 与 Redis 默认情况下不启用 AOF 持久化。我们可以在配置文件中启用它,并进行更详细的配置,比如下面的redis.conf文件: 在上面的配置文件中,我们可以通过 客户端的每次写操作都存储在文件 AOF 将客户端的每次写操作追加到文件末尾 aof 文件太大。打开aof文件恢复数据时,会很慢。为了解决这个问题,Redis支持aof文件重写。通过重写aof,可以生成一个最小的命令集来恢复当前的数据,如上面例子中有很多命令,可以重写为: aof文件是一个二进制文件。它并不像上面的例子那样直接保存每个命令,而是使用自己的Redis格式。以上仅用于演示目的。 可以通过redis.conf配置文件中的no-appendfsync-on-rewrite选项设置是否启用重写。该方法会重写每次fsync时间,影响服务器的性质,所以默认值不是也不推荐。 客户端向服务器发送bgrewriteaof命令,也可以让服务器进行AOF重写。 AOF重写方式也是一种异步操作,即如果要写入aof文件,Redis主进程会创建一个子进程来处理,如下图: 在写入aof日志文件时,如果Redis服务器宕机,aof日志文件会出现格式错误。当Redis服务器重新启动时,Redis服务器将拒绝打开aof文件。您可以按照以下步骤修复aof并恢复数据。 AOF只增加日志文件,因此对服务器性能影响较小,比RDB更快,占用内存更少。 通过上面的介绍,我们知道了RDB和AOF的优缺点。如何选择? 通过下面的表示,我们可以从几个方面来比较RDB和AOF。应用时应根据实际需要选择RDB或AOF。事实上,如果你希望你的数据非常安全,你可以使用这两种方法。是启用的,但是两种方法同时连续进行IO操作会影响服务器的性能,所以有时候你必须做出选择。 当RDB和AOF同时启用时,Redis会优先使用AOF日志来恢复数据,因为AOF存储的文件比RDB文件更完整。 以上是关于持久化机制的大量知识 作者:张俊红Redis
作为内存数据库中的键值对(NoSQL♻在内存中),存储数据。处理客户端请求时,所有操作都在内存中进行,如下图:
Redis
服务器守护进程退出,内存中的数据也会丢失。 Redis
作为缓存的项目来说,丢失数据可能并不是什么大问题。从数据源重新加载数据就可以了,但是如果直接加载用户发送的业务数据,Redis
的内存数据丢失就会造成损坏。 Redis
提供了持久化支持。我们可以选择不同的方式将数据从内存保存到硬盘,从而使数据得以保留。 Redis
提供了两种不同的数据持久化方式:RDB
和AOF
。下面我们来详细介绍一下这些不同的持久化方法。 RDB
RDB
是一种快照存储持久化方法。具体来说,它将给定时间的Redis
内存数据保存到硬盘上的文件中。默认保存的文件名为dump.rdb
,当Redis
服务器启动时,dump.rdb中的数据将被加载回内存。恢复数据。
激活 RDB 持久化模式
RDB
持久化模式非常简单。客户端可以将save发送到服务器
Redis
。 或 bgsave
命令允许服务器生成rdb
文件,或指定触发RDB配置文件条件。
1。 save 命令
save
命令是同步操作。# 同步数据到磁盘上
> save
复制代码
save
命令请求持久化时,服务器会在save
命令之后阻塞其他客户端的请求,直至数据同步完成。 save
命令。 2。 bgsave
save
不同。命令 bgsave
是异步操作。 # 异步保存数据集到磁盘上
> bgsave
复制代码
bgsave
、redi
hip主服务器进程会实现子进程解决数据同步问题,将数据保存到rdb文件中,子进程将退出。 save
命令相比,Redis
服务器正在处理bgsave,但它仍然可以接收进程
bgsave,以及其他
叉子. 子进程是同步的,因此当
附加并存储在文件末尾forks
子进程时,它们无法接受其他请求。这意味着如果forks
子进程过多,执行时间过长就会被阻塞。其他客户的要求。 3。配置服务端自动触发
Redis
。 RDB
数据同步是基于一定条件开启的,比如【秒内至少要完成多少次写操作】。 # 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000
复制代码
# 启动服务器加载配置文件
redis-server redis.conf
复制代码
rdb文件
# 是否压缩rdb文件
rdbcompression yes
# rdb文件的名称
dbfilename redis-6379.rdb
# rdb文件保存目录
dir ~/redis/
复制代码
RDB的几个优点
RDB的一些缺点
RDB
会导致一定时间内的数据丢失。比如我们设置同步时间为10分钟或者5分钟同步1000次。写入同步一次。如果在达到触发条件之前服务器崩溃,则此时的数据将会丢失。 AOF
RDB
,我们再来说说Redis♻:Apk ly文件)
。 RDB
不同,后者保存特定时间的快照。持久化方式AOF
记录从客户端到服务端的每一条写操作命令,并将写操作记录为协议Redisaof
。当Redis服务器重启时,会加载并运行命令文件aof
,以达到数据恢复的目的。 启用 AOF 持久化
# 开启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
,例如在按钮上多次执行 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
复制代码
set num 100000
复制代码
两种重写方式
# 默认不重写aof文件
no-appendfsync-on-rewrite no
复制代码
# 让服务器异步重写追加aof文件命令
> bgrewriteaof
复制代码
aof文件重写的好处
AOF文件损坏
# 修复aof日志文件
$ redis-check-aof -fix file.aof
复制代码
AOF的优点
AOF 的缺点
选择RDB还是AOF?
总结
Redis
。其实,如果你只使用Redis
作为缓存服务器,则无需考虑。不过,坚持下去,在目前大多数服务器架构中,Redis
只起到缓存服务器的作用,也可以作为数据库来存储我们的业务数据。在这一点上,我们应该更加了解。关于Redis
持久化策略的区别和选择。
链接:https://juejin.im/post/5d09a9ff51882577eb133aa9
来源:掘金商业转载请联系作者授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。