redis 架构详解
Redis架构详解可以从以下几个方面进行阐述:
一、部署架构
Redis有多种部署架构,适用于不同的应用场景和需求,主要包括以下几种:
-
单机模式(Standalone Mode)
- 特点:部署简单,配置方便,性能较好,适合小规模应用。
- 优点:易于实现和维护。
- 缺点:存在单点故障问题,一旦Redis服务宕机,数据将不可访问;容量受限于单台机器的内存。
-
主从复制(Master-Slave Replication)
- 特点:主节点负责写入操作,从节点负责读取操作,数据从主节点自动同步到从节点。
- 优点:提升读性能,多个从节点分担读请求;数据冗余,提高数据安全性。
- 缺点:依然存在单点故障,主节点宕机后需要手动或自动进行主从切换;从节点的数据复制有延迟,可能会存在短时间内的数据不一致。
-
哨兵模式(Sentinel Mode)
- 特点:Redis Sentinel是一种高可用性架构,用于自动监控主从复制中的节点状态,发生故障时自动将从节点提升为主节点,保证服务的可用性。
- 优点:自动化的主从切换,提升高可用性;减少人工干预,自动监控和恢复。
- 缺点:哨兵本身可能成为单点故障,建议部署多个哨兵节点形成集群;哨兵模式主要保证高可用性,但不能提升写入性能。
-
集群模式(Cluster Mode)
- 特点:Redis Cluster是Redis的分布式部署方案,适用于大规模数据存储和高并发访问。它将数据分片存储在不同的节点上,并支持无中心的节点拓扑结构。
- 优点:具有水平扩展能力,支持大规模数据和高并发;提供高可用性和故障恢复机制;读写分离,性能更高。
- 缺点:集群部署相对复杂,节点之间的网络通信较为频繁。
二、高性能架构设计
Redis之所以具有高性能,主要得益于其独特的架构设计,包括以下几个方面:
-
内存存储
- Redis将数据存储在内存中,而不是在磁盘上。内存的读写带宽远高于磁盘,支持更高的并发读写操作,从而提高了Redis的响应速度。
-
高效的数据结构和操作
- Redis使用简单的键值对存储模型,并提供了多种高效的数据结构,如字符串、列表、哈希表、集合和有序集合等。这些数据结构在内存中进行优化,能够快速进行数据操作,减少了数据处理的复杂性和计算开销。
-
IO多路复用技术
- Redis使用了非阻塞I/O和事件驱动模型,充分利用了操作系统的I/O多路复用机制(如epoll)。这种机制使单个线程可以监视多个文件描述符(如网络套接字),避免了为每个连接创建一个线程或进程的开销,从而提升了性能。
-
异步操作
- Redis支持异步操作,可以在后台执行一些耗时的操作,如持久化到磁盘或复制数据到其他节点。通过异步操作,Redis可以更快地响应客户端请求,而不必等待这些操作的完成。
-
优化的网络通信协议
- Redis使用自己优化的RESP(REdis Serialization Protocol)网络通信协议。该协议简单且高效,能够减少网络通信的开销,提升数据传输效率。
三、Redis 基本架构组件
-
Redis Server(服务器)
- 这是 Redis 的核心部分,负责接收客户端的请求、处理数据操作并返回结果。它包含多个重要的模块。例如,在内存存储方面,它有一个高效的数据结构存储系统,用于存储键值对。这些数据结构包括字符串(String)、列表(List)、哈希(Hash)、集合(Set)和有序集合(Sorted Set)等。以字符串为例,它可以存储简单的文本信息,如用户的登录令牌;列表可用于实现消息队列,像记录用户操作日志的顺序队列;哈希适合存储对象相关的数据,如用户信息对象,其中用户名、年龄等可以作为哈希的字段存储在一个键对应的哈希结构中。
- 服务器还包含网络通信模块,用于处理与客户端的连接。它通过 TCP 协议监听指定端口(默认是 6379),接收来自客户端的请求,如 SET、GET 等操作命令,并将处理后的结果返回给客户端。
-
Redis Client(客户端)
-
客户端是用于与 Redis 服务器进行交互的工具。有多种类型的客户端,包括官方提供的 Redis - CLI(命令行客户端),它是一个简单的命令行工具,用户可以通过输入 Redis 命令来直接操作服务器。例如,在命令行中输入
SET key value就可以在服务器中存储一个键值对,GET key则可以获取对应键的值。 -
除了命令行客户端,还有各种编程语言对应的客户端库,如 Python 的
redis - py、Java 的
Jedis等。这些客户端库使得在不同的编程语言环境中能够方便地与 Redis 服务器进行通信。以
redis - py为例,在 Python 应用程序中,可以通过以下方式使用:
import redisr = redis.Redis(host='localhost', port=6379)r.set('key', 'value')print(r.get('key'))
-
-
数据持久化模块
- RDB(Redis Database)持久化:RDB 是一种快照式的持久化方式。Redis 会在满足一定条件时(如经过指定的时间间隔或者达到一定的写操作次数),将内存中的数据以二进制格式保存到磁盘上的一个文件(RDB 文件)中。例如,在备份场景下,RDB 文件可以方便地用于数据恢复。当 Redis 服务器重新启动时,它可以通过加载这个 RDB 文件快速地恢复数据状态。这种方式的优点是数据恢复速度快,文件体积相对较小,适合用于大规模数据的备份;缺点是可能会丢失两次快照之间的数据。
- AOF(Append Only File)持久化:AOF 持久化方式是通过记录服务器执行的写命令来实现持久化的。所有的写命令(如 SET、LPUSH 等)会以追加的方式写入一个 AOF 文件。在服务器重启时,Redis 会重新执行 AOF 文件中的命令来恢复数据。AOF 的优点是数据丢失风险较低,能够更好地保证数据的完整性;缺点是文件体积可能会因为不断追加命令而变得很大,并且数据恢复速度相对较慢,因为需要重新执行大量的命令。
相关文章:
redis 架构详解
Redis架构详解可以从以下几个方面进行阐述: 一、部署架构 Redis有多种部署架构,适用于不同的应用场景和需求,主要包括以下几种: 单机模式(Standalone Mode) 特点:部署简单,配置方便…...
多分类交叉熵与稀疏分类交叉熵
总结: 标签为 One-hot 编码的多分类问题,用分类交叉熵对于标签为整数的多分类问题,用稀疏分类交叉熵稀疏分类交叉熵内部会将整数标签转换为 One-hot 编码,而如果标签已经是 One-hot 编码的形式,再使用稀疏分类交叉熵就会多此一举。 算例 假设我们有三个类别:A、B 和 C。…...
PHP 8新特性深度解析与实战应用
引言 PHP作为一种广泛使用的开源脚本语言,以其在Web开发领域的卓越性能而闻名。随着PHP 8的发布,这门语言再次迎来了许多令人兴奋的新特性和改进。本文将深入探讨PHP 8的新特性,并提供实战应用示例,帮助开发者更好地理解和使用PH…...
【C语言】UDP通信
udp使用的是数据报传输。可以一对一,一对多进行传输,用于快速,实时性高的场景 服务器端: 使用步骤: 1.创建socket 2.bind绑定可接收的客户端 3.while{ recv接收数据 send发送数据 } #include <stdio.h> #inclu…...
用Keytool和OpenSSL生成和签发数字证书
一)keytool生成私钥文件(.key)和签名请求文件(.csr),openssl签发数字证书 J2SDK在目录%JAVA_HOME%/bin提供了密钥库管理工具Keytool,用于管理密钥、证书和证书链。Keytool工具的命令在JavaSE6中已经改变,不过以前的命令仍然支持。Keytool也可以用来管理对称加密算法中…...
算法-动态数组-62.不同路径
一、题目 二、思路解析 1.思路: 对于找到目的地它的来源主要来源于目的地的上一格和目的地的左一格 2.常用方法: 无 3.核心逻辑: 1.处理边界: a.只向右移动,至始至终只有一条路径 for(int i0;i<m;i){dp[i][0]1; } …...
Y3编辑器教程5:触发器进阶使用(镜头、UI、表格、函数库、排行榜、游戏不同步)
文章目录 一、游戏声音设计二、 游戏镜头设计2.1 镜头的基本参数2.2 镜头时间轴动画 三、界面编辑3.1 界面编辑器设置3.2 添加按钮事件3.3 触发编写 四、 表格编辑器(实现对话UI)4.1 一维表和多维表4.2 数据验证、搜索、保存与撤销4.3 Excel导入导出4.4 …...
基于小程序实现地图定位、轨迹绘制、地图标点、快捷导航、唤醒导航APP、开箱即用
目录 前言研究背景与意义研究目标与内容研究方法与技术路线小程序地图组件介绍定位技术与原理轨迹绘制技术地图标注与标记功能地图定位与轨迹绘制功能实现定位功能设计与实现获取用户当前位置总结说明代码块前言 研究背景与意义 地图定位和轨迹追踪作为智能手机中常见的功能之…...
JAVA后端实现全国区县下拉选择--树形结构
设计图如图: 直接上代码 数据库中的格式: JAVA实体类: Data public class SysAreaZoningDO {private Long districtId;private Long parentId;private String districtName;private List<SysAreaZoningDO> children; } MapperSQL语句…...
数据结构速成
1. 数据结构与算法 2. 顺序表 3. 链表 4. 栈与队列 5. 串 6. 树与二叉树(1) 7. 树与二叉树(2) 8. 图 9. 图的应用 10. 查找 11. 排序(1) 12. 排序(2)...
Electron-Vite 项目搭建(Vue)
前提条件 Node.js: 确保已安装 Node.js 版本 18 或更高版本 (推荐使用最新稳定版)。Vite: 确保 Vite 版本为 4.0 或以上。包管理工具: 推荐使用 pnpm,但也可以使用 npm 或 yarn。 安装 Electron-Vite 首先,在项目中安装 electron-vite 作为开发依赖&a…...
如何寻找和改进开源项目来作为个人简历项目
寻找开源项目: 使用开源代码平台(如GitHub)来搜索优质的开源项目。例如,可以通过搜索关键词如“spring boot”, in name spring boot或者使用更具体的条件,如“star大于1000”来筛选热门项目。 star:>…...
STEM真题 第五题 比 n 小的最大数
题目描述 给定一个正整数 n,请将 n 中的每位数字重新排列并组成一个新数,要求新数的值要小于 n,请找出所有 符合要求的新数中最大的那个正整数,如果不存在这样的正整数,则输出 -1。例 1:n 312࿰…...
HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face 论文解读
1. 引言 近年来,大型语言模型(LLMs)如ChatGPT在自然语言处理领域取得了惊人的进展,展现出强大的语言理解、生成和推理能力。然而,当前的LLMs仍然存在一些局限性,例如无法处理复杂信息(如视觉和…...
深入了解HTTPDNS-使用Python实现一个HTTPDNS服务
深入了解HTTPDNS-使用Python实现一个HTTPDNS服务 HTTPDNS的起源 传统的DNS(Domain Name System)是互联网的核心协议之一,负责将人类可读的域名解析为机器可理解的IP地址。经典的DNS查询基于UDP协议,在特定网络环境下可能存在如下…...
IDEA 可视化使用 git rebase 合并分支步骤 使git分支树保持整洁
模拟环境 dev 分支开发完一个功能,需要合并到 master 分支,如果现在直接 merge 合并的话 git分支树会出现杂乱分叉,先把 master 分支 rebase 到 dev git分支树就会是整洁的一条直线 git rebase介绍 rebase:翻译成中文是重新设定,…...
网络安全教学博客(二):常见网络安全威胁剖析
在上一篇博客中,我们了解了网络安全的基础概念和重要性。今天,让我们深入探讨一下常见的网络安全威胁,以便我们能够更好地识别和防范它们。 恶意软件(Malware) 病毒(Virus):病毒是一…...
区块链技术及应用(期末考试版)
简述区块链中的默克尔树结构及其作用。 默克尔树(Merkle Tree)是一种二叉树数据结构,其叶节点是数据块的哈希值,而每个非叶节点是其子节点哈希值的哈希。它的主要作用是高效且安全地验证大规模数据结构中的数据内容。 解释为什么…...
Ubuntu22.04 docker如何发布镜像(和用git差不多)
在dockerhub上创建远程仓库:https://hub.docker.com/ 将本地镜像打tag,并修改成可以上传到 dockerhub 的形式 # 查看本地镜像# 修改镜像 ## docker tag 镜像名称:标签 新的镜像名称(要和远程仓库dockerhub上的一致):新的标签pus…...
基于python绘制数据表(上)
利用python绘制各种数据图表 绘制柱形图-源码 from openpyxl import Workbook from openpyxl.chart import BarChart, Reference# 创建工作薄 wb Workbook(write_onlyTrue) # 创建工作表 ws wb.create_sheet(月收入)# 准备数据 rows [(月份, 销售额),(1, 23),(2, 43),(3, …...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
