Redis持久化RDB和AOF持久化

众所周知Redis是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

1.面试的时候总是会被问到数据持久化的问题,今天我们来讲一下数据持久化,Redis是一个内存数据库,它的数据都保存在内存中,如果实例宕机,那么数据则全部丢失。如何保证数据的完整性和安全性也是提高服务高可用的重要机制之一。

Redis提供了完善的持久化机制,可以把内存中的数据持久化到磁盘上,方便我们进行备份数据和快速恢复数据,这种持久化的方式分为以下两种:

  • RDB
  • AOF

一. RDB:持久化方式:就是备份数据的方式,redis会fork当前的进程为子进程,然后在配置文件的目录下生产一个叫dump.rdb的文件,里面就是备份的数据

  • 它的优点如下:

  • RDB文件数据是被压缩写入的,因此RDB文件的体积要比整个实例内存要小,当实例宕机恢复时,加载RDB文件的速度很快,能够在很短时间内迅速恢复文件中的数据

  • 它的缺点也很明显:

  • 由于是某一时刻的数据快照,因此它的数据并不全,生成 RDB 文件的代价是比较大的,它会消耗大量的 CPU 和内存资源

  • 在Redis上执行save和bgsave命令都可以生成RDB文件,但前者是在前台执行的,也就是说在生成RDB文件时,会阻塞整个实例,在RDB未生成之前,任何请求都是无法处理的,对于内存很大的实例,生成RDB文件非常耗时,显然这是我们不能接受的。

因此RDB比较适用于以下场景:

  • 主从全量同步数据
  • 数据库备份
  • 对于丢失数据不敏感的业务场景,实例宕机后快速恢复数据

二. AOF全称为Append Only File(追加日志文件)。它与RDB不同的是,AOF中记录的是每一个命令的详细信息,包括完整的命令类型、参数等。只要产生写命令,就会实时写入到AOF文件中,然后开机的时候,把这些命令重新执行一遍,就生成了这些数据。

  • 它的优点如下:

  • appendfsync always:每次写入都刷盘,对性能影响最大,占用磁盘IO比较高,数据安全性最高

  • appendfsync everysec:1秒刷一次盘,对性能影响相对较小,节点宕机时最多丢失1秒的数据

  • appendfsync no:按照操作系统的机制刷盘,对性能影响最小,数据安全性低,节点宕机丢失数据取决于操作系统刷盘机制

  • 它的缺点也很明显:

  • 随着时间增长,AOF文件会越来越大

  • AOF文件刷盘会增加磁盘IO的负担,可能影响Redis的性能。

总结:我们需要针对不同的业务场景选择合适的持久化方式,也可以根据RDB和AOF的优点配合使用,保证Redis数据的安全性,又可以兼顾它的性能。

上一篇:关于redis创建集群时出现[ERR] Node x.x.x.x:6379 is not empty. Either the node already knows other nodes (check


下一篇:Redis学习笔记