Redis 及其在系统设计中的作用

什么是Redis 


Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息代理。它因其快速的性能、灵活性和易用性而得到广泛应用。

Redis 数据存储类型

Redis 允许开发人员以各种数据结构(例如字符串、位图、位域、哈希、列表、集合、有序集合、地理空间数据、超日志和流)存储、检索和操作数据。

使用 Redis 的优势


所有 Redis 数据都驻留在服务器的主内存中,这与 PostgreSQL、SQL Server 等将大部分数据存储在磁盘上的数据库不同。因此,Redis 可以支持更高数量级的操作和更快的响应时间。因此,它实现了超快的性能,平均读写操作时间不到毫秒,从而支持每秒数百万次的操作。

Redis 提供了一个完整的系统,它为我们提供了两种架构(单片机和分布式)的缓存系统,从而提高了数据检索速度,因为通过内存中的键(例如哈希表)直接访问操作将降低从原始 SQL 数据库读取数据的整体复杂性。

Redis 的工作架构


Redis 架构有多种,具体取决于用例和规模:

1. 单 Redis 实例


这是最直接的 Redis 部署方式。它要求用户设置并运行小型实例,以帮助他们扩展服务并加速其发展。然而,它也有其自身的缺点,因为如果正在运行的实例崩溃或不可用,所有对 Redis 的调用都会失败。因此,系统的整体性能和速度会下降。

单 Redis 实例

2. Redis HA(高可用性)


另一种常见的设置是主部署加上一个始终与副本保持同步的辅助部署。辅助实例在我们的部署中可以是一个或多个实例,这有助于扩展从 Redis 的读取,并在主实例丢失的情况下提供故障转移。

Redis HA(辅助实例故障转移)

3. Redis Sentinel


Sentinel 对应于分布式系统。它的设计理念是,一个哨兵进程集群协同工作,协调状态,从而为 Redis 系统提供持续的可用性。哨兵进程的职责如下:

  • 监控:确保主实例和辅助实例按预期运行。
  • 通知:将 Redis 实例中发生的事件通知所有系统管理员。
  • 故障期间管理:如果主实例长时间不可用,并且有足够多的节点确认故障,哨兵节点可以在故障期间启动一个进程。

Redis 哨兵

4. Redis 集群/Redis 集群主从模型:Redis 的终极架构

Redis 集群是 Redis 的终极架构。它允许 Redis 进行水平扩展。

在 Redis 集群中,我们决定将存储的数据分散到多台机器上,这称为分片。因此,集群中的每个 Redis 实例都被视为整个数据的一个分片。

Redis 集群使用算法分片。为了找到给定键对应的分片,我们会对键进行哈希运算,并将结果除以分片数量。然后,使用确定性哈希函数(即给定键始终映射到同一个分片),我们可以推断出将来读取特定键时该键的位置。

系统设计中的 Redis 集群架构

为了处理系统中分片的进一步添加(重新分片),Redis 集群使用哈希槽 (Hashslot),所有数据都映射到该哈希槽。因此,当我们添加新的分片时,我们只需将哈希槽从一个分片移动到另一个分片,从而简化了向集群添加新主实例的过程。这样做的好处是,无需停机,并且性能影响最小。我们来看下面的示例:

假设哈希槽的数量为 10K。
实例 1 包含从 0 到 5000 的哈希槽,
实例 2 包含从 5001 到 10000 的哈希槽。

现在,假设我们需要添加另一个实例,那么哈希槽的分布如下:

实例 1 包含从 0 到 3333 的哈希槽。
实例 2 包含从 3334 到 6667 的哈希槽。
实例 3 包含从 6668 到 10000 的哈希槽。

Redis 集群中的 gossiping 是什么?


为了确定整个集群的健康状况,Redis 集群使用 gossiping。在下面的示例中,我们有 3 个主实例和 3 个辅助节点。所有这些节点都会不断确定哪些节点当前可用于处理请求。假设有足够多的分片一致认为实例 1 没有响应,它们就可以将实例 1 的辅助节点提升为主节点,以保持集群的健康。一般来说,为了实现最强健和容错的网络,主节点数量必须为奇数,并且每个节点有两个副本。

Redis 持久化模型的类型

Redis 提供了两种主要的持久化选项来将数据保存到磁盘:RDB 和 AOF。这两种选项各有优缺点,具体使用哪种取决于应用程序的具体需求。以下列出了几种持久化选项:

1. RDB(实时数据库)持久化模型:


RDB 是 Redis 数据集的即时快照,以二进制文件的形式存储。RDB 文件包含数据集在特定时间点的表示形式,可用于在服务器崩溃或重启时恢复数据集。由于 RDB 采用二进制格式存储数据,因此在磁盘空间利用率和性能方面非常高效。

RDB 可以配置为定期保存数据,或者根据某些条件(例如最小写入操作次数)保存数据。然而,RDB 的缺点是,如果服务器在按计划创建 RDB 快照之前崩溃,则可能导致数据丢失。

RDB 中的快照


快照是 Redis 持久化过程中的一个过程,它会在内存中创建整个数据集的时间点快照,并将其以二进制格式保存到磁盘。此快照可用于在服务器崩溃或重启时恢复数据集。Redis 通过其 RDB 持久化机制支持快照。

快照的工作原理如下:

  • Redis 从父进程派生出一个子进程。
  • 子进程在内存中创建数据集当前状态的副本。
  • 子进程将数据集副本写入临时 RDB 文件。
  • 子进程将临时文件重命名为最终的 RDB 文件名,并覆盖所有现有的 RDB 文件。
  • 子进程终止,Redis 继续处理请求。

Redis 可以配置为定期自动执行快照,或根据某些条件(例如最小写入操作次数或自上次快照以来经过的最短时间)执行快照。如果我们正在进行繁重的工作并更改大量键,那么每分钟将生成一个快照;如果更改相对较少,则每 5 分钟生成一个快照;如果更改更少,则每 15 分钟生成一个快照。

RDB(实时数据库)的优势

  • RDB 文件非常适合备份,因为它是 Redis 数据非常紧凑的单文件时间点表示。它使我们能够在发生灾难时轻松恢复数据集的不同版本。
  • 它非常适合灾难恢复,因为它是一个可以传输到远程数据中心的单个紧凑文件。


RDB(实时数据库)的劣势


现在让我们比较一下 Redis DB 的劣势:

  • RDB 并非最佳选择。
  • 如果我们需要最大限度地降低 Redis 停止工作时数据丢失的可能性,
  • 我们可以配置生成 RDB 的不同保存点。但是,我们通常每五分钟或更长时间就会创建一个 RDB 快照,因此,如果 Redis 由于任何原因而未正确关闭而停止工作,我们应该准备好丢失最新几分钟的数据。

2. AOF(仅追加文件)持久化模型


AOF 将所有写入操作以人类可读的格式记录到一个文件中。该文件包含自上次保存以来对数据集执行的所有写入操作的记录,以便在发生崩溃时重建数据集。AOF 比 RDB 具有更好的持久性,因为它将每个写入操作都记录到磁盘。

AOF 可以配置为定期保存数据,或根据某些条件(例如最小写入操作次数)保存数据。但是,由于 AOF 会将每个写入操作都记录到磁盘,因此会导致性能下降和磁盘空间占用增加。

由于快照的持久性较差,因此仅追加文件是 Redis 的另一种完全持久化策略。

可以通过以下方式在配置文件中启用 AOF:

appendonly yes

AOF 的工作原理?

  • Redis 会从父进程 fork 一个子进程。
  • 子进程会在内存中创建数据集当前状态的副本。
  • 子进程将数据集的副本写入临时文件中的新 AOF 文件。
  • 父进程将所有新的更改累积到内存缓冲区中(但同时,它会将新的更改写入旧的仅追加文件,因此如果重写失败,我们是安全的)。
  • 当子进程完成文件重写后,父进程会收到信号,并将内存缓冲区中的更改追加到子进程生成的文件末尾。
  • 然后,Redis 会自动将旧文件重命名为新文件,并开始将新数据追加到新文件中。


AOF 的优势

  • Redis 的 AOF 日志更加持久,因为我们可以采用不同的 fsync 策略,例如完全不 fsync、每秒 fsync 或每次查询时 fsync。
  • 它是一个仅追加的日志,因此不会出现寻道,也不会在断电时出现损坏问题。
  • 如果日志由于磁盘已满或其他原因突然结束,Redis 的检查工具可以自动修复任何写入一半的命令。


AOF 的缺点


现在让我们比较一下 AOF 的缺点:

  • 对于相同的数据集,这些文件通常比等效的 RDB 文件更大。
  • 根据具体的 fsync 策略,它可能比 RDB 慢。
  • AOF 可以提高数据一致性,但不能保证数据完全一致。数据丢失的可能性很小,但考虑到 RDB 速度更快,丢失数据的可能性比 RDB 模式要小。

选择哪个——实时数据库 (RDB) 还是追加文件 (AOF)?

通常的思路是,如果我们想要获得与 PostgreSQL 等普通数据库相当的数据安全性,我们应该同时使用这两种持久化方法。如果我们非常重视数据,但又能忍受灾难发生时几分钟的数据丢失,那么我们可以只使用 RDB。

3. 无持久化模型


Redis 还提供了完全禁用持久化的选项,在这种情况下,数据仅存储在内存中。当 Redis 用作缓存时,此选项非常有用,因为数据丢失后可以重新生成。

4. 混合 (RDB+AOF) 持久化模型


Redis 提供了同时使用 RDB 和 AOF 持久化的选项,这被称为混合持久化。此选项兼具 RDB 和 AOF 的优点,因为 AOF 日志用于在重启后重放写入操作,而 RDB 快照用于在特定时间点恢复数据集。

Redis 中的可用性、一致性和分区


以下是 Redis 如何处理可用性、一致性和分区的简要概述:

  • 可用性:Redis 使用主从复制模型来确保高可用性。这意味着有一个“主”节点接受所有写入操作,还有多个“从”节点实时从主节点复制数据。如果主节点发生故障,可以将其中一个从节点提升为新的主节点。
  • 一致性:Redis 为单键操作提供强一致性保证,这意味着如果将值写入某个键,集群中的任何节点都可以立即读取该值。但是,Redis 不为多键操作提供事务一致性,这意味着某些节点可能看到与其他节点不同的数据视图。
  • 分区:Redis 支持分片,允许将数据集分区到多个节点。Redis 使用基于哈希的分区方案,其中每个键根据其哈希值分配给特定节点。Redis 还提供了一种在集群中添加或删除节点时重新分配数据的机制。


我们可以使用 Redis 来替代原始数据库吗?


基于以上讨论,Redis 似乎是原始数据库的更好选择,因为它提供了更快的检索速度。即便如此,Redis 也不会被用作系统中数据库的主要选项。

Redis 应该始终作为提升整体系统性能的第二支撑,因为根据 CAP 定理,Redis 既不具备一致性,也不具备高可用性。

这是因为,如果服务器崩溃,我们将丢失内存中的所有数据。崩溃时丢失这些数据是可以接受的,但对于某些其他应用来说,在服务器重启后立即重新加载 Redis 数据就变得非常重要。

结论


总的来说,Redis 是一个强大的系统设计工具,但它可能并不适合所有用例。在决定是否在特定应用程序中使用 Redis 时,务必仔细考虑其局限性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:如何用关系型数据库征服NoSQL核心战场?

写在前面:当SQL遇见NoSQL的十年之变 2012年MongoDB掀起文档数据库革命时,开发者们不得不在灵活性与事务一致性之间做痛苦抉择。十年后的今天,MySQL 8.0的JSON功能已实现: ✅ 二进制存储效率超越传统BLOB 40% ✅ 多值索引使JSON查…

Dart Flutter数据类型详解 int double String bool list Map

目录 字符串的几种方式 bool值的判断 List的定义方式 Map的定义方式 Dart判断数据类型 (is 关键词来判断类型) Dart的数据类型详解 int double String bool list Map 常用数据类型: Numbers(数值): int double Strings(字符串) String Booleans(布尔…

win11中wsl在自定义位置安装ubuntu20.04 + ROS Noetic

wsl的安装 环境自定义位置安装指定ubuntu版本VsCodeROS备份与重载备份重新导入 常用命令参考文章 环境 搜索 启用或关闭 Windows 功能 勾选这2个功能,然后重启 自定义位置安装指定ubuntu版本 从网上找到你所需要的相关wsl ubuntu版本的安装包,一般直…

得物业务参数配置中心架构综述

一、背景 现状与痛点 在目前互联网飞速发展的今天,企业对用人的要求越来越高,尤其是后端的开发同学大部分精力都要投入在对复杂需求的处理,以及代码架构,稳定性的工作中,在对比下,简单且重复的CRUD就显得…

Nginx 二进制部署与 Docker 部署深度对比

一、核心概念解析 1. 二进制部署 通过包管理器(如 apt/yum)或源码编译安装 Nginx,直接运行在宿主机上。其特点包括: 直接性:与操作系统深度绑定,直接使用系统库和内核功能 。定制化:支持通过…

Rust 2025:内存安全革命与异步编程新纪元

Rust 2025 Edition通过区域内存管理、泛型关联类型和零成本异步框架三大革新,重新定义系统级编程语言的能力边界。本次升级不仅将内存安全验证效率提升80%,更通过异步执行器架构优化实现微秒级任务切换。本文从编译器原理、运行时机制、编程范式转型三个…

std::unorderd_map 简介

1. unorderd_map 简介 1. unorderd_map 简介 简介1.1. 实现原理1.2. 函数1.3. 问题集 1.3.1. emplace、emplace_hint、insert 的区别 1.4. 参考链接 简介 unordered_map 是 C 标准库中的一个容器&#xff0c;它定义在 <unordered_map> 头文件里。它借助哈希表来存储键…

在线测试来料公差

UI 上图 V1 上图 V2 V3 Code import tkinter as tk from tkinter import messagebox, scrolledtext import socket import threading from datetime import datetime import os import logging from PIL import Image, ImageTk import subprocess# 定义文件夹路径…

【优秀三方库研读】【C++基础知识】odygrd/quill -- 折叠表达式

compute_encoded_size_and_cache_string_lengths 方法中这段代码是一个C的折叠表达式&#xff08;fold expression&#xff09;的应用&#xff0c;用于计算多个参数编码后的总大小。下面我将详细解释这段代码的每个部分&#xff0c;并说明为什么这样写。 代码如下&#xff1a; …

数据库安装和升级和双主配置

备份和导入数据 ./mysqldump -u root -p123321 test > test.sql rsync -av test.sql root192.168.0.212:/usr/local/mysql/ ./mysql -uroot -p test < …/test.sql sudo tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ sudo ln -sfn /usr/loca…

【C语言】条件编译

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 条件编译 常用的预处理指令 核心应用场景 1.防止头文件重复包含 2.跨平台兼容性 3.调试模式与发布模式 4.功能开关 5.代码兼容性处理 结语 条件编译 一般情况下,源程序中所有…

如何在安卓平板上下载安装Google Chrome【轻松安装】

安卓平板可以通过系统内置的应用商店直接搜索并下载谷歌浏览器。用户打开平板上的“Play 商店”&#xff0c;在搜索框输入Google Chrome。出现结果后&#xff0c;点击第一个带有“Google LLC”字样的应用图标&#xff0c;然后点“安装”按钮。下载和安装时间和网速有关&#xf…

.NET代码保护混淆和软件许可系统——Eziriz .NET Reactor 7

.NET代码保护混淆和软件许可系统——Eziriz .NET Reactor 7 1、简介2、功能特点3、知识产权保护功能4、强大的许可系统5、软件开发工具包6、部署方式7、下载 1、简介 .NET Reactor是用于为.NET Framework编写的软件的功能强大的代码保护和软件许可系统&#xff0c;并且支持生成…

利用 SSE 实现文字吐字效果:技术与实践

利用 SSE 实现文字吐字效果:技术与实践 引言 在现代 Web 应用开发中,实时交互功能愈发重要。例如,在线聊天、实时数据监控、游戏中的实时更新等场景,都需要服务器能够及时将数据推送给客户端。传统的请求 - 响应模式在处理实时性要求较高的场景时显得力不从心,而 Server…

一个简单易用的密码生成器

基于浏览器的确定性密码生成工具&#xff0c;通过用户输入的网站名称和盐值生成符合安全要求的密码。特点&#xff1a; • 相同输入始终生成相同密码 • 密码自动包含大小写字母、数字和特殊符号 • 以字母开头&#xff0c;固定8位长度 • 完全在客户端运行&#xff0c;保护…

水上与水下遥控技术要点对比

1. 水上无人机遥控器技术要点 (1) 控制方式 多通道控制&#xff1a;通常使用2.4GHz或5.8GHz无线电信号&#xff0c;支持多通道&#xff08;如4通道以上&#xff09;分别控制飞行器的姿态&#xff08;俯仰、横滚、偏航&#xff09;和油门。 高级飞行模式&#xff1a;如定高模…

Android_SDK链接 雷神模拟器(端口问题) --- app笔记

调试环境&#xff1a;JDK&#xff08;java&#xff09; SDK&#xff08;android&#xff09; Node.js 雷神模拟器&#xff08;或 真机&#xff09; Appium&#xff08;Appium Server【内外件&#xff08;dos内件、界面化工具&#xff09;】、Appium Inspector&#xff09; p…

FreeRTOS【3】任务调度算法

重要概念 在运行的任务&#xff0c;被称为"正在使用处理器"&#xff0c;它处于运行状态。在单处理系统中&#xff0c;任何时间里只能有一个任务处于运行状态。 非运行状态的任务&#xff0c;它处于这 3 中状态之一&#xff1a;阻塞(Blocked)、暂停(Suspended)、就绪…

SLAM常用地图对比示例

序号地图类型概述1格栅地图将现实环境栅格化&#xff0c;每一个栅格用 0 和 1 分别表示空闲和占据状态&#xff0c;初始化为未知状态 0.52特征地图以点、线、面等几何特征来描绘周围环境&#xff0c;将采集的信息进行筛选和提取得到关键几何特征3拓扑地图将重要部分抽象为地图&…

【Vue】TypeScript与Vue3集成

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. 前言2. 环境准备与基础搭建2.1. 安装 Node.js 与 npm/yarn/pnpm2.2. 创建 Vue3 TypeScript 项目2.2.1. 使用 Vue CLI2.2.2. 使用 Vite&#xff08;推荐&#xff09;2.2.3. 目录结构简述 3. Vue3 TS 基础语法整…