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

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

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


猜你喜欢

  • 如何面对 SPA 页面白屏问题?

    单页面应用(Single Page Application,SPA)越来越受到前端开发的欢迎,因为 SPA 可以实现更好的用户体验,而且开发效率更高。但是,SPA 页面白屏问题经常困扰前端开发者,本文...

    15 天前
  • ES9 新特性:新增静态属性 descriptor 和__proto__的 Object 方法

    ES9 是 ECMAScript 标准的第九个版本,于 2018 年发布。本文讲述 ES9 新增的两个 Object 方法,分别是静态属性 descriptor 和__proto__,它们为 Java...

    15 天前
  • 解决 Angular Material 中 mat-select 组件选项重叠的 Bug

    在使用 Angular Material 构建前端应用时,我们经常会用到 mat-select 组件来实现下拉列表的选择功能。但是有时候会发现,当选项内容过长时,会出现选项重叠的 Bug,导致用户无法...

    15 天前
  • 优化 Jest 测试性能的几种方法

    Jest 是目前前端项目中常用的测试框架之一。在开发中,测试是保证代码质量和减少错误的重要手段,但测试也不是万能的,错误地使用测试会导致开发效率降低和代码的大量冗余。

    15 天前
  • Fastify 性能瓶颈分析及优化

    Fastify 是一个快速、低开销、轻松使用的 Web 框架。它是 Node.js 社区中最新的框架之一,与 Express 和 Koa 相比,它更加注重性能、低内存占用和快速启动时间。

    15 天前
  • RxJS 与 Redux 状态管理集成实践

    在现代 Web 开发中,前端应用程序的复杂性越来越高,这给状态管理带来了挑战。Redux 是一种广泛使用的状态管理库,可以使状态管理更容易,更可预测。然而,Redux 并不是最好的方案,RxJS 是一...

    15 天前
  • 无障碍响应式设计:如何实现无障碍友好的响应式设计

    随着移动设备的普及,响应式设计(Responsive Web Design)已经成为了前端开发的标配。优秀的响应式设计需要考虑多种设备尺寸和屏幕分辨率,以及不同用户的操作习惯和需求。

    15 天前
  • Hapi.js 中的输出控制技巧

    Hapi.js 是 Node.js 中最受欢迎的 Web 框架之一,它提供了许多灵活的方法来控制应用程序的输出。在这篇文章中,我们将深入探讨 Hapi.js 的输出控制技巧,包括如何处理错误,自定义响...

    15 天前
  • 解决 ES9 中 Function.prototype.toString() 方法变化的问题

    在 ES9 (ECMAScript 2018) 中,Function.prototype.toString() 方法的行为发生了变化。这对于前端开发者来说可能会造成一些问题。

    15 天前
  • 解决 Socket.io 存在的性能瓶颈问题

    在前端开发过程中,Socket.io 是一个常用的实现实时通信的工具库。它可以帮助我们在客户端和服务器之间建立实时、双向的通信连接,使得开发实时应用变得更加便捷。 然而,在一些高并发的场景下,Sock...

    15 天前
  • Tailwind 的 “支持自定义属性”的技术

    前言 Tailwind 是一个流行的 CSS 框架,它通过提供大量的 CSS 类来简化前端开发。在 2.2 版本中,Tailwind 还提供了一项新的功能:支持自定义属性。

    15 天前
  • MongoDB 的常见写入问题及解决方案

    在前端开发中,MongoDB 是一个非常常见的数据库。但是,在使用 MongoDB 时,我们可能会遇到一些写入问题,这些问题可能导致我们在数据存储方面遇到困难。在本文中,我们将讨论 MongoDB 中...

    15 天前
  • 如何在ES6中使用扩展运算符对数组和对象进行操作

    引言 ES6为开发者提供了很多强大的特性,其中最有用的特性之一是扩展运算符。扩展运算符是一种语法糖,它可以很方便地对数组和对象进行操作。在本文中,我们将深入探讨如何在ES6中使用扩展运算符对数组和对象...

    15 天前
  • CSS Grid 布局如何实现自适应图片放置?

    CSS Grid 布局是一项强大的前端技术,它允许我们以简单且灵活的方式构建网格系统,而不需要额外的 JavaScript 代码或计算。其中之一的应用是自适应图片放置,它可以在各种设备上实现响应式设计...

    15 天前
  • RxJS 如何优化冷 Observables 的性能

    前言 RxJS 是一个流行的 JavaScript 函数响应式编程库,它的许多功能都是基于 Observables(可观察对象)的。然而,Observables 的性能问题常常被人们所忽视,特别是冷 ...

    15 天前
  • Serverless 架构下的 Docker 应用部署

    引言 Serverless 架构是一种新的云计算模型,它将应用程序的部署与运行责任从开发人员转移到云服务提供商。与基于虚拟机或裸机的传统部署模式相比,Serverless 架构具有低延迟、高可伸缩性和...

    15 天前
  • 如何在 ReactJS 项目中,通过 Webpack 构建服务器端代码

    Web应用经常会分为客户端和服务器端,通常来说,客户端使用ReactJS等松耦合的JavaScript库,而服务器端使用NodeJS、Express等的服务端框架。

    15 天前
  • 将 ESLint 集成到 Create React App 中

    前言 在前端团队中,代码风格的一致性和代码质量的保障是非常重要的。ESLint 是一个强大的统一代码风格工具,并且可以发现代码错误和安全问题。Create React App 是一个流行的 React...

    15 天前
  • 如何使用 Headless CMS 实现个性化推荐

    随着 Web 技术的发展,越来越多的网站和应用程序需要处理大量的内容。 这些内容通常需要管理,包括创建,编辑和发布。而传统的 CMS(Content Management System)通常为单体应用...

    15 天前
  • Material Design 中相对于 iOS 更适合 Android 的设计方式

    在移动应用领域,Material Design 和 iOS 设计风格是两种非常流行的风格。然而,由于 Android 和 iOS 系统的差异,Material Design 更适合 Android 系...

    15 天前

相关推荐

    暂无文章