Redis是基于内存的数据存储,因此基本上是易失性的。Redis服务器重启时,所有数据可能会消失,为了解决这一问题,Redis提供了两种数据保留方式:RDB (Redis数据库快照)AOF (追加仅文件)。在本文中,我们将探讨这两种方式的特点和区别,并总结各自的设置方法和优缺点。

1. RDB (Redis数据库快照)

RDB方式是Redis将存储在内存中的数据定期以快照(Snapshot)的形式保存到磁盘。Redis根据设置的周期生成RDB文件,通过该文件可以在服务器重启时恢复数据。

RDB的主要特点

  • 保存周期:可以通过redis.conf文件中的save选项设置数据存储到磁盘的周期。例如save 60 1000表示每60秒在1000个以上的键被更改时生成快照。
save 60 1000
  • 文件位置:RDB文件默认存储在dir指定的目录中,默认路径是/var/lib/redis,文件名为dump.rdb
dir /var/lib/redis/
dbfilename dump.rdb

RDB的优点

  • 高性能:RDB方式对Redis的性能影响不大,如果快照生成周期较长,则CPU资源消耗也较小。
  • 小文件大小:由于定期记录整个数据的快照,因此文件大小相对较小,备份管理也比较方便。

RDB的缺点

  • 数据丢失可能性:由于RDB方式是定期保存的,因此如果Redis突然中断,最后的快照之后的数据可能会丢失。
  • 恢复速度:RDB将所有数据一次性快照保存,因此在恢复大量数据时可能需要更多时间。

RDB的适用场景

RDB主要适合于缓存数据等可以定期备份的情况。在需要定期进行数据备份而非实时工作队列的情况下更为有利,同时可以在不影响Redis服务器性能的情况下,轻松确保数据的保留性。

2. AOF (追加仅文件)

AOF通过将Redis的所有写操作按顺序记录到磁盘,提供持续的数据保留。AOF文件记录所有数据更改,因此即使Redis服务器重启也可以通过AOF文件完美恢复。

AOF的主要特点

  • 命令记录方式:AOF文件记录所有数据更改命令。每当发生写命令时就写入磁盘,因此所有的数据变更记录都会被保存。
  • 文件位置和名称:AOF文件默认保存为appendfilename选项指定的名称。默认值为appendonly.aof,保存于由dir设置指定的目录中。
dir /var/lib/redis/
appendonly yes
appendfilename appendonly.aof
  • 同步周期:可以通过appendfsync选项设置数据写入磁盘的周期。
appendfsync everysec  # 每秒同步一次

AOF的优点

  • 数据保留性:所有写操作都记录到磁盘,因此即使服务器突然中断,也可以恢复到最后的记录状态。
  • 不记录读取命令:AOF只记录所有数据更改命令,因此不必要的读取命令不包括在文件中,节省了存储空间。
Redis数据保留选项信息图

AOF的缺点

  • 性能下降可能性:由于记录所有写操作,特别是当appendfsync设置为always时,性能可能会下降。
  • 文件大小增加:如果数据更改频繁,AOF文件的大小可能会变得非常大。为了应对此问题,Redis可以通过BGREWRITEAOF命令压缩AOF文件。

AOF的适用场景

AOF在工作队列数据保留重要的应用程序中非常有用。在数据保留性重要的情况下,可以结合定期同步(everysec)设置,以平衡性能和数据保留性。

3. 同时使用RDB和AOF

在Redis中,可以同时使用RDB和AOF方式以平衡数据保留性和性能。在两种方式均开启时,Redis将优先使用AOF文件进行恢复。

  • RDB:快速便捷地存储数据,并通过快照方式提供基本备份。
  • AOF:记录所有写操作,提高数据保留性,从而最小化数据丢失的可能性。

4. Redis设置示例

以下是同时使用RDB和AOF,并保持适当性能和数据保留性的设置示例。

# Redis基本目录和文件设置
dir /var/lib/redis/
dbfilename dump.rdb
appendfilename appendonly.aof

# RDB快照设置(每60秒当1000个以上键被更改时保存快照)
save 60 1000

# AOF设置
appendonly yes
appendfsync everysec  # 每秒同步一次

# AOF文件重写设置(当文件大小超过64MB时每100%增加时自动重写)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

结束语

在本文中,我们探讨了Redis的两种数据保留方式:RDB和AOF。由于各自的保留性和性能存在差异,因此根据应用程序的特性选择适当的方式至关重要。在下一篇文章中,我们将讨论Redis内存管理和性能优化,介绍如何高效利用Redis的内存。