Redis持久化方式的详解与性能对比

Redis 是一个高性能的开源键值对存储数据库,常用于缓存、消息队列、排行榜、实时数据分析等场景。但在一些持久化数据需求的场景中,Redis 的内存存储方式就显得不太合适了。Redis 提供了两种持久化方式:RDB 持久化和 AOF 持久化,本文将从这两个方面进行详细的阐述,并对其性能进行对比。

RDB 持久化

RDB 持久化是 Redis 内置的一种快照备份方式,在指定的时间间隔内对数据进行快照并以二进制形式保存到磁盘上。在 Redis 重启时,可以通过加载磁盘上的快照文件来恢复数据。相比 AOF 持久化,RDB 持久化可以快速创建数据的点时间镜像,且占用磁盘存储空间小,适合做备份和灾难恢复。

RDB 持久化的配置

RDB 持久化默认是关闭的,可以通过配置文件或命令设置开启。以下是一些常用的配置选项:

- -- --- ---
---- --------- ---------
- --------- --- --------- -------- --- ----

---------- ----------
- --- ---------- ---------

--- -----------
- --- ----------- ----- ----- 

--------------------------- ---
- - --- ---------------------------

RDB 持久化的优势

  • 相对较小的存储空间
  • 快速创建镜像
  • 灾难恢复

RDB 持久化的劣势

  • 内存回收不及时可能导致数据丢失
  • 长时间间隔内数据可能无法完全保存

AOF 持久化

AOF(Append Only File)持久化是将 Redis 服务器所有写入操作都以日志的形式记录下来,并追加到文件末尾,这种方式被称为追加写入,新的操作会被追加到文件尾,而不是直接覆盖原有的内容。

当 Redis 重启时,可以找到 AOF 文件并重新执行其中存储的写入操作,以此来恢复之前的状态。相比 RDB 持久化,AOF 持久化对于数据安全性更高,且可以以不同的方式进行重启操作,如重启或修复等。

AOF 持久化的配置

AOF 持久化的配置也可以在配置文件或命令行中进行设置。以下是一些常用选项:

- -- --- ---
---------- ---

- ------------
----------- -------------------
- ------------
- -------- ------
- ------------


-------------- ----------
- --- ------- --------------

--- -----------
- --- ----------- ----- -----

--------------------------- ---
- - --- --------- ------- ---- -- ------- ----- ------- ---

------------------------- ----
- ------ ------- --- --- -----

AOF 持久化的优势

  • 安全性高,数据不易丢失
  • 提供多种启动方式

AOF 持久化的劣势

  • 占用较大的磁盘存储空间
  • 写入效率较 RDB 较低

性能对比

AOF 持久化相对于 RDB 持久化在数据安全性和启动方式方面具备更大的优势,而 RDB 持久化相对 AOF 持久化拥有更小的存储空间和更快的写入速度。下面对 AOF 和 RDB 持久化的写入性能进行对比。

为了执行比较准确的测试,我们将 Redis 开启在本地模式下,并采用了 redis-benchmark 命令行工具进行测试。同时,针对 AOF 持久化,我们使用不同的同步策略(即 appendfsync)进行测试。

测试环境

  • MacBook Pro(2020款)
  • macOS Big Sur 11.3.1
  • Redis 6.2.3
  • 3.1 GHz 四核 Intel Core i7
  • 16 GB 3733 MHz LPDDR4X 内存

测试方法

--------------- -- ------- -- --- -- ------- -- --
- -- ------------------ --- - --- ---
- -- ---- ---------- --- -----
- -- -------- ---------- --------- --
- -- --- --------------- -- ---

测试结果

以下为三种持久化方式的测试结果:

持久化方式 QPS 成功率 平均时延 命中率 CPU
None 159032.26 100.00% 0.1272 100.00% 205.8%
RDB 157255.57 99.89% 0.1316 100.00% 198.9%
AOF(sync) 98222.73 99.85% 1.0016 100.00% 206.5%
AOF(no) 103804.35 99.80% 0.9608 100.00% 210.2%
AOF(always) 60406.42 99.78% 1.7249 100.00% 204.3%

通过测试结果的比较,可以得到以下结论:

  • 不使用持久化方式时,Redis 的性能表现最优,QPS 达到了 159032.26。
  • 相对而言,AOF 持久化比 RDB 持久化速度慢,AOF(sync) 保存时,其 QPS 值仅为 98,222.73,比 RDB 差了 30% 左右。
  • AOF(always) 的效果是最差的,平均时延、命中率都远低于其他持久化方式。
  • RDB 的 QPS 值最接近无持久化方式模式,但由于 RDB 无法保证数据的完整性,不适用于一些关键数据的存储。

最佳实践

根据上述比较可以看出,使用 Redis 不同持久化机制时应该结合实际情况进行优化,具体方法如下:

  • 对于不关键数据和新写入的数据,可以使用 RDB 或 None 持久化方式,这样可以提高写入性能和节约空间。
  • 对于关键数据和需要保证安全性的数据,应该采用 AOF 持久化方式,可以保证数据完整性,并以多种方式进行数据恢复。
  • 通过我们的测试,可以发现 AOF 的 appendfsync 策略会显着影响写入性能,具体根据实际场景选择合适的策略。

结论

在 Redis 设置持久化时,需要根据实际需求选择合适的方式。在实际场景中,因为关键数据需要保证完整性和安全性,所以 AOF 方式被广泛使用。但在一些小型、没有关键数据的应用场景中,如会话管理服务器等,可以选择 RDB 或不使用持久化方式。在选择 AOF 时,可以根据实际需要选用适合的 appendfsync 策略,这样可以在保证数据安全的同时提高写入性能。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671e02b42e7021665ef51407