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