Redis的持久化

什么叫持久化?
就是把数据保存到可永久保存的存储设备中,主要是将内存中的对象存储在数据库中或者磁盘中
为什么要持久化?
为了保证效率,数据都是存储在内存中的, 但是一旦重启系统或者关闭系统,就再也找不回来了。为了长期保存,就要将Redis放在缓存中的数据做持久化存储
Redis怎么实现持久化?
多种持久化方式
1.RDB持久化方式能够在指定的时间间隔对你的数据进行快照存储
2.AOF持久化方式记录每次对服务器写操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾,redis还能对AOF文件惊醒后台重写,是的AOF文件的体积不至于过大
3.如果你只希望你的数据在服务器运行的时候存在,也可以不做持久化
4,可以同时打开两种持久化方式,在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据要完整。

RDB方式和AOF方式的优势对比

RDB的优点
1.RDB是一个非常紧凑的文件,保存了某个时间点的数据集,非常适合数据集的备份,比如你可以在每个小时保存一下过去24小时内的数据,同时每天保存过去30天的数据,即使出了问题你也可以根据需求恢复到不同版本的数据集
2.RDB非常适合灾难恢复
3.RDB在保存RDB文件时,父进程唯一需要做的就是fork出一个子进程,接下来的工作全都由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化Redis的性能
4.与AOF相比,再恢复大的数据集的时候,RDB方式会更快一些

当redis需要保存dump.rdb文件的时候,服务器执行以下操作
1.redis调用forks,同事拥有父子进程
2.子进程将数据集写入到一个临时RDB文件中
3.当子进程完成对新RDB文件的写入时,Redis用新RDB文件替换原来的RDB文件,并删除旧的RDB文件

这样使得Redis可以从写时复制机制获益

AOF方式的优点
使用AOF回让你的Redis更加耐久
你可以使用不同的fsync策略,无fsync,每秒fsync,每次写的时候fsync,使用默认的每秒fsync策略,Redis的新跟那个依然很好,(fsync是由后台线程进行处理的主线程会尽力处理客户端请求)出现故障,最多丢失一秒的数据

AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题。

Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写:重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。

AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。导出(export) AOF 文件也非常简单:举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。

RDB 方式可以保存过去一段时间内的数据,并且保存结果是一个单一的文件,可以将文件备份到其他服务器,并且在回复大量数据的时候,RDB 方式的速度会比 AOF 方式的回复速度要快。

AOF 方式默认每秒钟备份1次,频率很高,它的操作方式是以追加的方式记录日志而不是数据,并且它的重写过程是按顺序进行追加,所以它的文件内容非常容易读懂。可以在某些需要的时候打开 AOF 文件对其编辑,增加或删除某些记录,最后再执行恢复操作。

RDB 方式的缺点

如果你希望在 Redis 意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么 RDB 不适合你.虽然你可以配置不同的save时间点(例如每隔 5 分钟并且对数据集有 100 个写的操作),是 Redis 要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在 Redis 意外宕机,你可能会丢失几分钟的数据。

RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候, fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级内不能响应客户端的请求。如果数据集巨大并且 CPU 性能不是很好的情况下,这种情况会持续1秒, AOF 也需要 fork ,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

AOF 方式的缺点

对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。

RDB 由于备份频率不高,所以在回复数据的时候有可能丢失一小段时间的数据,而且在数据集比较大的时候有可能对毫秒级的请求产生影响。

AOF 的文件提及比较大,而且由于保存频率很高,所以整体的速度会比 RDB 慢一些,但是性能依旧很高。

工作原理
AOF重写和RDB创建快照一样,都巧妙得利用了写时复制机制
1.redis执行fork(),现在同时用于父子进程
2.子进程开始将新AOF文件得内容写道临时文件
对于所有新执行的写入命令,父进程一边将他们累积到一个内存缓存中,一边将这些改动追加到现有AOF文件的末尾,这样即使在重写的中途发生停机,现有的aof文件也还是安全的
3.当子进程完成重写工作的时候,会给父进程发送一个信号,父进程在接收到信号后,将内存中的所有数据追加到新的AOF文件的末尾
4.现在Redis原子的用新文件替换旧文件,之后所有的命令都会直接追加到新的AOF文件的末尾

RDB方式持久化的开启

Redis默认的持久化方式是RDB,并且默认是打开的

RDB的保存方式分为主动保存和被动保存,主动保存可以在redis-cli中输入save 即可,被动保存需要满足配置文件中设定的触发条件,目前官方默认的触发条件可以在redis.conf中看到

save 900 1
save 300 10
save 60 10000

服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改。
服务器在60秒之内,对数据库进行了至少10000次修改。

满足触发条件后,数据就会被保存为快照,正是因为这样才说 RDB 的数据完整性是比不上 AOF 的。

触发保存条件后,会在指定的目录生成一个名为 dump.rdb 的文件,等到下一次启动 Redis 时,Redis 会去读取该目录下的 dump.rdb 文件,将里面的数据恢复到 Redis。

这个目录我们使用config get dir 查看

返回的结果就是存储的地方

RDB方式的数据是不可靠的除非断掉的那一刻正好满足触发条件

关闭RDB

将原来的三个配置注释掉 并且添加save ""

主动关闭是不受配置文件影响的

除了save还有其他的保存方法么?

Redis提供了save和bgsave这两种不同的保存方式,并且这两个方式在执行的时候都会调用rdbSave函数,但是调用的方式不同

sava 直接调用rdbsave方法,阻塞Redis主进程,知道保存完成为止,在主进程阻塞期间,服务器不能处理客户端的任何请求

bgsave 则fork出一个子进程,子进程负责调用rdSave,并在保存完成之后向主进程发送信号,通知保存已经完成,因为rdbSave在子进程被调用,所有Redis服务器在bgSave执行期间依然可以继续处理客户端的请求

注:save是同步操作, bgSave是异步操作

实际上shutdown也是可以保存的,他会在关闭前将数据保存下来 但是前提是要把持久化打开,也就是说把那三行配置再打开就好了。

下面我们来讲一讲AOF方式的持久化

默认是不开启AOF的,如果想要启用则需要到redis.conf配置文件中打开

appendonly yes

设置同步方式

appendfsync always  # 每次有数据修改发生时都会写入AOF文件(安全但是费时)。
appendfsync everysec  # 每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no  # 从不同步。高效但是数据不会被持久化。

默认配置是 everysec

自定义aof记录文件名称

appendfilename "xxxx"

 将appendonlyappendfsyncappendfilename设置好并保存。重新启动 Redis 服务

$./redis-server

 

 AOF恢复测试

比如我们现在kill -9 22654 再重新启动,通过客户端我们可以查看数据是否都在

结果是生效的

怎样从RDB方式切换为AOF方式

在redis2.2版本或以上版本,可以在不重启的情况下,从RDB切换到AOF

为最新的dump.rdb问价你创建一个备份,将备份放到一个安全的地方,执行以下两条命令

redis-cli config set appendonly yes
redis-cli config set save “”

确保写命令会被正确地追加到 AOF 文件的末尾。
执行的第一条命令开启了 AOF 功能:Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。

执行的第二条命令用于关闭 RDB 功能。这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。

别忘了在 redis.conf 中打开 AOF 功能!否则服务器重启后,之前通过 CONFIG SET 命令设置的配置就会被遗忘, 程序会按原来的配置来启动服务器。

那我们如何选择这两种持久化方式呢?

  • 对于企业级的中大型应用,如果不想牺牲数据完整性但是又希望保持高效率,那么你应该同时使用 RDB 和 AOF 两种方式;

  • 如果你不打算耗费精力在这个地方,只需要保证数据完整性,那么优先考虑使用 AOF 方式;

  • RDB 方式非常适合大规模的数据恢复,如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

Redis 密码持久化

在 Redis 中数据需要持久化,密码也要持久化。在客户端通过命令:

config set requirepass zxc9527

可以为 Redis 设置值为zxc9527的密码,但是当 Redis 关闭并重新启动后,权限验证功能就会失效,再也不需要密码。所以,密码也需要在 redis.conf 中持久化。打开 redis.conf 找到 requirepass 配置项,取消其注释并在后面设置密码:

requirepass zxc9527
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值