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

news2025/5/15 11:22:25

什么是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.coloradmin.cn/o/2342292.html

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

相关文章

爬虫-oiwiki

我们将BASE_URL 设置为 "https://oi-wiki.org/" 后脚本就会自动开始抓取该url及其子页面的所有内容,并将统一子页面的放在一个文件夹中 import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import os import pd…

强化学习核心原理及数学框架

1. 定义与核心思想 强化学习(Reinforcement Learning, RL)是一种通过智能体(Agent)与环境(Environment)的持续交互来学习最优决策策略的机器学习范式。其核心特征为: ​​试错学习​​&#x…

【技术派后端篇】技术派中 Session/Cookie 与 JWT 身份验证技术的应用及实现解析

在现代Web应用开发中,身份验证是保障系统安全的重要环节。技术派在身份验证领域采用了多种技术方案,其中Session/Cookie和JWT(JSON Web Token)是两种常用的实现方式。本文将详细介绍这两种身份验证技术在技术派中的应用及具体实现…

【基础】Node.js 介绍、安装及npm 和 npx功能了解

前言 后面安装n8n要用到,做一点技术储备。主要是它的两个工具:npm 和 npx。 Node.js介绍 Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,允许开发人员在浏览器之外编写命令行工具和服务器端脚本,是一个基于 C…

助力网站优化利用AI批量生成文章工具提升质量

哎,有时候觉得写东西这事儿吧,真挺玄乎的。你看着那些大网站的优质内容,会不会突然冒出个念头——这些家伙到底怎么做到日更十篇还不秃头的?前阵子我蹲在咖啡馆里盯着屏幕发呆,突然刷到个帖子说现在用AI写文章能自动纠…

SpringBootTest报错

Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or … 解决方案:在SpringTest注解中添加属性(classes )填写启动类 如我的启动类是MainApplication.class javax.websocket.server.ServerContainer no…

w~视觉~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327888 #几个论文 Fast Charging of Energy-dense Lithium-ion Batteries Real-time Short Video Recommendation on Mobile Devices Semantic interpretation for convolutional neural networks: What makes a ca…

Redis安装及入门应用

应用资料:https://download.csdn.net/download/ly1h1/90685065 1.获取文件,并在该文件下执行cmd 2.输入redis-server-lucifer.exe redis.windows.conf,即可运行redis 3.安装redis客户端软件 4.安装后运行客户端软件,输入链接地址…

NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve

//"dev": " NODE_OPTIONS--openssl-legacy-provider vue-cli-service serve" // 修改后(Windows 适用) "dev": "vue-cli-service serve --openssl-legacy-provider" 升级 Node.js 到 v14,确保依赖…

上篇:深入剖析 BLE 底层物理层与链路层(约5000字)

引言 在无线通信领域,Bluetooth Low Energy(BLE)以其超低功耗、灵活的连接模式和良好的生态支持,成为 IoT 与可穿戴设备的首选技术。要想在实际项目中优化性能、控制功耗、保证可靠通信,必须对 BLE 协议栈的底层细节有深入了解。本篇将重点围绕物理层(PHY)与链路层(Li…

2025 年“泰迪杯”数据挖掘挑战赛B题——基于穿戴装备的身体活动监测问题分析

摘要 本文聚焦于基于穿戴设备采集的加速度计数据,深入研究志愿者在日常活动中的行为特征,构建了多个数学建模框架,实现从身体活动监测、能耗预测、睡眠阶段识别到久坐预警等多个目标。我们依托于多源数据融合与机器学习模型,对人体活动状态进行识别与分析,为健康管理、行…

Linux424 chage密码信息 gpasswd 附属组

https://chat.deepseek.com/a/chat/s/e55a5e85-de97-450d-a19e-2c48f6669234

自定义指令简介及用法(vue3)

一介绍 防抖与节流,应用场景有很多,例如:禁止重复提交数据的场景、搜索框输入搜索条件,待输入停止后再开始搜索。 防抖 点击button按钮,设置定时器,在规定的时间内再次点击会重置定时器重新计时&#xf…

【Spring Boot】深入解析:#{} 和 ${}

1.#{} 和 ${}的使用 1.1数据准备 1.1.1.MySQL数据准备 (1)创建数据库: CREATE DATABASE mybatis_study DEFAULT CHARACTER SET utf8mb4;(2)使用数据库 -- 使⽤数据数据 USE mybatis_study;(3&#xff…

从实验室到产业端:解码 GPU 服务器的八大核心应用场景​

一、深度学习与人工智能的基石​ 在深度学习领域,GPU 服务器的并行计算架构成为训练大规模模型的核心引擎 —— 传统 CPU 集群训练千亿参数模型需数月,而基于某国际知名芯片厂商 H100 的 GPU 服务器可将周期缩短至数周,国内科技巨头 910B 芯…

java—12 kafka

目录 一、消息队列的优缺点 二、常用MQ 1. Kafka 2. RocketMQ 3. RabbitMQ 4. ActiveMQ 5. ZeroMQ 6. MQ选型对比 适用场景——从公司基础建设力量角度出发 适用场景——从业务场景角度出发 四、基本概念和操作 1. kafka常用术语 2. kafka常用指令 3. 单播消息&a…

数据库-数据类型、约束 和 DQL语言

标题目录 数据类型数字类型INT 型BIGINT 型DOUBLE 类型 字符类型定长字符串变长字符串 日期类型 约束主键约束非空约束唯一性约束检查约束外键约束 DQL 语言WHERE 子句连接多个条件IN (列表)NOT IN (列表)BETWEEN...AND...DISTINCT多字段去重 模糊查询NULL 值判断排序&#xff…

Dify升级-linux环境下使用zip离线安装方式部署升级

Dify安装时Linux服务器到github网络不好,git clone拉去不下来代码。使用本地windows电脑下载zip包形式上传进行了安装。但是随着dfiy版本升级,本地使用最新版本的,也需要进行下升级。参考升级指导以及自己环境情况,升级步骤如下。…

基于SpringBoot+Vue的影视系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,影视推荐系统当然不能排除在外。影视系统是在实际应用和软件工程的开发原理之上,运用Java语言以及Spring Boot、VUE框架进行开…

搭建Stable Diffusion图像生成系统实现通过网址访问(Ngrok+Flask实现项目系统公网测试,轻量易部署)

目录 前言 背景与需求 🎯 需求分析 核心功能 网络优化 方案确认 1. 安装 Flask 和 Ngrok 2. 构建 Flask 应用 3. 使用 Ngrok 实现内网穿透 4. 测试图像生成接口 技术栈 实现流程 优化目标 实现细节 1. 迁移到Flask 2. 持久化提示词 3. 图像下载功能 …