Redis持久化RDB


Redis持久化RDB

背景

Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存中,在处理客户端请求时,所有操作都在内存当中进行。

但是存储在内存中的数据,只要服务器关机(各种原因引起的),内存中的数据就会消失了,不仅服务器关机会造成数据消失,Redis服务器守护进程退出,内存中的数据也一样会消失。

对于只把redis当做缓存来用的项目,数据消失问题不大,重新把数据加载进来即可,但如果直接把业务数据存储在redis中,把redis作为数据库来使用,在其存储重要业务数据,那么Redis的内存数据丢失所造成的影响也许是毁灭性的。

为了避免内存中数据丢失,Redis提供了对持久化的支持,接下来介绍一下持久化方案之一RDB。

RDB

RDB是一种快照存储持久化方式,具体就是讲redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名是dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件中的数据导内存中

开启RDB

  • save命令
    save命令是一个同步操作
    原理

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

如果数据量太大,同步数据会执行很久,而这期间Redis服务器也无法接收其他请求,所以,最好不要在生产环境使用save命令。

  • bgsave命令
    bgsave是一个异步操作
    原理

当客户端发出bgsave命令时,Redis服务器主进程会forks一个子进程来同步数据,在数据保存到rdb文件之后,子进程将会退出。

所以与save命令相比,Redis服务器在处理bgsave采用子进程进行IO写入,而主进程仍然可以接收其他请求,但forks子进程是同步的,所以forks子进程时,一样不能接收其他请求,这意味着如果forks一个子进程花费的时间太久,仍然会有阻塞其他客户端请求的情况发生。

  • 配置文件
    除了通过客户端发送命令外,还有一种方式,就是在redis配置文件中的save指定到达触发RDB持久化条件。
    # 900s内至少达到一条写命令
    save 900 1
    # 300s内至少达至10条写命令
    save 300 10
    # 60s内至少达到10000条写命令
    save 60 10000

这种通过服务器配置文件触发RDB的方式,与bgsave命令类似,达到触发条件时,会forks一个子进程进行数据同步,不过最好不要通过这方式来触发RDB持久化,因为设置触发的时间太短,则容易频繁写入rdb文件,影响服务器性能,时间设置太长则会造成数据丢失。

rdb的优缺点

优点

  • 与AOF方式相比,通过RDB文件恢复数据比较快
  • RDB文件非常紧凑,适用于数据备份
  • 通过RDB进行数据备份,由于使用子进程生成,所以对Redis服务器性能影响较小

    缺点

  • 如果服务器宕机的话,采用RDB的方式会造成某个时段内数据的丢失,比如我们设置10分钟同步一次或5分钟达到1000次写入就同步一次,那么如果还没达到触发条件服务器就死机了,那么这个时间段的数据会丢失。
  • 使用save命令会造成服务器阻塞,直接数据同步完成才能接收后续请求。
  • 使用bgsave命令在forks子进程时,如果数据量太大,forks的过程也会发生阻塞,另外,forks子进程会耗费内存。

文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
Redis持久化AOF Redis持久化AOF
Redis持久化AOF介绍与RDB存储某个时刻的快照不同,AOF持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以Redis协议追加保存到以aof为后缀的文件,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢
下一篇 
Redis的发布订阅模式 Redis的发布订阅模式
Redis的发布订阅模式介绍Redis是一款基于内存的非关系型数据库,提供了多种数据结构存储数据,存取数据的速度还很快,除了这些优点,它还提供了其他特色功能,比如:管道、发布订阅模式。 本文主要描述发布订阅模式的使用。 发布订阅模式发布订阅
  目录