[Redis]Redis持久化之RDB快照

Redis持久化之RDB快照

Redis是一个内存数据库管理系统。所谓的内存数据库,就是将数据库中的数据保存在内存当中。内存数据库的读写效率会比一般的数据库更快,但是一旦断电或者宕机,数据库中的数据就会全部丢失。

为了应对数据丢失的问题,Redis提供了将数据持久化到本地的功能,以便对数据进行备份。Redis支持两种形式的数据持久化,一种是RDB快照(snapshotting),另外一种是AOF(append-only-file)。本篇先对其中的RDB快照进行讲解。


简介

Redis创建快照时,会将某一时刻存在于内存中的数据保存到本地文件中。快照文件以.rdb后缀保存。

具体过程是:

  1. Redis调用fork创建一个子进程。(父子进程共享内存,直至其中一个进程对内存进行了写操作)

  2. 子进程负责将数据写入一个临时文件,父进程则继续处理数据库读写请求。

  3. 完全写入成功后,调用rename将新的RDB文件替换原来的RDB文件。


通过Redis命令手动创建快照

Redis提供了两条命令用于手动创建快照。

BGSAVE

调用BGSAVE命令时,Redis会在后台异步地保存当前数据库中的数据。具体过程与上一节中提到的过程一样。调用SYNC命令时,如果主服务器没有在执行BGSAVE操作的话,会执行一次BGSAVE。

SAVE

调用SAVE命令时,Redis会执行同步保存,阻塞所有客户端,不再响应客户端发送的请求。SAVE命令一般来说只用于没有足够内存执行BGSAVE命令,或者对于等待保存占用的时间不敏感时才会使用。调用SHUTDOWN命令关闭服务器时也会先执行一次SAVE命令。

注:调用LASTSAVE命令可以查看最近一次将数据持久化到本地的时间,该命令返回一个UNIX时间戳。


通过配置文件设置自动保存快照

Redis的RDB快照配置项一共有六个。默认配置如下:

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./

下面逐个讲解一下它们的作用。

  1. save这一项后面需要加上两个数字,分别代表秒数和更改数。假如设置了save m n,就代表如果在经过m秒之后发生了至少n次更改,Redis就会自动执行一次BGSAVE命令。save配置项可以同时存在多个,如果save太过频繁,会影响到Redis的性能,频率太低则会增加数据丢失的风险,所以建议根据需要对save项进行配置。如果移除所有的save配置项或者加上一项save “”,则自动保存功能会被关闭。

  2. 默认情况下,如果后台保存出错了,Redis会停止接受写操作。如果后台的保存进程重新开始工作,Redis也会自动恢复接受写操作。这是一种比较简单粗暴的解决方式,通过这种方式可以显示地提醒维护者Redis出现了故障,但也会导致在故障被修复前Redis都没办法提供完整的服务。如果设置了stop-writes-on-bgsave-error为no,则Redis出问题的时候也可以照常工作,不过这就需要更细致地监控Redis服务器的变化。

  3. rdbcompression配置项设置是否对RDB文件进行压缩。如果将rdbcompression设置为no的话RDB文件保存的速度会快一些,但是保存下来的文件也会相应地变大。Redis使用LZF压缩RDB文件。

  4. rdbchecksum配置项控制Redis是否使用循环冗余检验。如果启用循环冗余检验,可以保证文件的完整性,但是进行文件保存和加载时会损失10%左右的性能,如果追求最大性能可以考虑把这一项关闭。Redis使用的是CRC64。

  5. dbfilename配置RDB文件的名字。

  6. dir配置RDB文件保存的路径。AOF产生的文件也会被保存到这个路径下面。


使用RDB快照进行持久化的优缺点

优点

  1. 通过合理的配置,可以让Redis每隔一段时间就保存一次数据库副本,也可以很方便地将数据还原到特定的时间点。

  2. RDB文件相比AOF占用的空间更小,恢复数据的速度也更快。

  3. 如果创建RDB文件时出现了错误,Redis不会将它用于替换原来的文件,所以出错时不会影响到之前保存的版本。

缺点

  1. 如果硬件、系统、Redis三者其中之一出现问题而崩溃,Redis会丢失全部数据,保留下来的数据只有上一个时间点创建的快照。如果数据对于应用程序来说非常重要,那么出现错误时的损失会非常大。

  2. fork子进程占用的内存随着数据库中数据的增加而增加,耗费的时间也会越来越多。


总结

RDB快照算是一种折中的数据持久化策略,比较适合那些对于一段时间内数据的损失不敏感的应用程序。Redis也提供了不少配置项用于配置快照的创建方式,用户可以根据自身需要调整配置,以达到自己想要的最佳效果。

另:Redis在Github上开源,里面一些用于创建快照的组件(CRC64、LZF压缩等)都可以在上面找到源码,如果有需要的可以直接利用起来。


关于Redis的另一种持久化策略AOF,请读者查看博主的另一篇博客Redis持久化之AOF

参考资料:
https://github.com/antirez/redis
Redis命令参考
《Redis实战》(Redis IN ACTION) [美] Josiah L. Carlson

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值