【Redis】谈谈Redis的设计

news2025/5/14 18:33:38

Redis(Remote Dictionary Service)是一个高性能的内存键值数据库,其设计核心是速度、简单性和灵活性。以下从架构、数据结构、持久化、网络模型等方面解析 Redis 的设计实现原理:


1. 核心设计思想

  • 内存优先:数据主要存储在内存中,通过异步持久化到磁盘保证数据安全。
  • 单线程模型:处理命令使用单线程(6.0+ 后引入多线程 I/O),避免锁竞争,简化设计。
  • 高效数据结构:基于 C 语言实现多种定制化数据结构(如 SDS、跳跃表),优化性能。

2. 内存数据结构

Redis 的键值对不仅仅是简单的字符串,而是支持多种数据结构,每种结构针对不同场景优化:

(1) 字符串(String)
  • 底层实现:SDS(Simple Dynamic String),支持动态扩容、二进制安全。
  • 优化点:预分配冗余空间,减少内存重分配次数。
(2) 列表(List)
  • 底层实现:双向链表ziplist(压缩列表,适用于小元素)。
  • 用途:消息队列、最新消息排行。
(3) 哈希(Hash)
  • 底层实现:哈希表ziplist(小数据时)。
  • 优化点:渐进式 rehash,避免一次性扩容阻塞服务。
(4) 集合(Set)
  • 底层实现:哈希表intset(整数集合,元素全为整数时)。
  • 特性:无序、唯一元素,支持交集/并集操作。
(5) 有序集合(ZSet)
  • 底层实现:跳跃表(SkipList) + 哈希表
  • 跳跃表优势:查询、插入、删除时间复杂度为 O(log N),实现简单且高效。
(6) 其他结构
  • HyperLogLog:基数统计(如 UV 去重)。
  • Bitmaps:位操作(如用户在线状态)。
  • Stream:消息流(类似 Kafka 的日志结构)。

3. 单线程模型

(1) 为何选择单线程?
  • 避免锁竞争:多线程需处理共享资源的同步问题,增加复杂度。
  • 内存操作极快:单线程足以应对百万级 QPS(纯内存操作)。
  • 非阻塞 I/O:通过事件驱动模型(如 epoll)处理并发连接。
(2) 多线程优化(Redis 6.0+)
  • I/O 多线程:网络请求的读取和解析由多线程处理,命令执行仍为单线程。
  • 后台线程:用于异步处理持久化、大 Key 删除等任务。

4. 持久化机制

Redis 提供两种持久化方式,平衡性能与数据安全:

(1) RDB(Redis Database)
  • 原理:定时生成内存快照(snapshot)保存到磁盘(.rdb 文件)。
  • 优点:文件紧凑,恢复速度快。
  • 缺点:可能丢失最后一次快照后的数据。
(2) AOF(Append-Only File)
  • 原理:记录所有写命令(追加到文件末尾),重启时重放命令恢复数据。
  • 写策略
    • appendfsync always:每次写操作同步到磁盘(最安全,性能最低)。
    • appendfsync everysec:每秒同步一次(折中方案,默认)。
    • appendfsync no:由操作系统决定同步时机(最快,风险最高)。
  • 优点:数据丢失风险低。
  • 缺点:文件体积大,恢复速度慢。
(3) 混合持久化(Redis 4.0+)
  • 结合 RDB 和 AOF:定期生成 RDB 快照,后续增量数据通过 AOF 记录。
  • 重启时先加载 RDB,再重放 AOF 增量命令,兼顾速度和安全性。

5. 高可用与扩展性

(1) 主从复制
  • 异步复制:主节点将写操作传播给从节点,从节点提供读服务。
  • 增量同步:通过复制积压缓冲区(repl_backlog)实现断线重连后的部分同步。
(2) Sentinel(哨兵)
  • 故障检测与切换:监控主节点状态,自动选举新主节点并通知客户端。
  • 高可用集群:支持多哨兵节点投票决策,避免单点故障。
(3) Cluster(集群)
  • 数据分片:采用哈希槽(16384 slots)将数据分布到多个节点。
  • 去中心化:节点间通过 Gossip 协议通信,无需代理。
  • 故障转移:主节点宕机时,从节点自动升级为主节点。

6. 性能优化设计

  • 内存管理
    • 通过 jemalloc 分配器减少内存碎片。
    • 支持内存淘汰策略(如 LRU、LFU、TTL)。
  • 管道(Pipeline):批量发送命令,减少网络往返时间。
  • Lua 脚本:原子化执行复杂操作,减少网络开销。

7. 设计取舍与挑战

  • 一致性:主从复制异步导致弱一致性。
  • 内存限制:数据规模受限于内存容量(可通过 Cluster 分片扩展)。
  • 持久化延迟:RDB 和 AOF 的持久化策略需要在性能与安全间权衡。

总结

Redis 的设计哲学是用简单换取高效,其核心优势在于:

  1. 基于内存的极速访问;
  2. 精心优化的数据结构;
  3. 单线程无锁模型;
  4. 灵活的可扩展性。

在实际应用中,需根据业务场景选择持久化策略、内存淘汰策略,并通过主从复制、Cluster 集群等机制保障高可用。对于更高一致性要求的场景,可结合其他数据库(如 MySQL)或分布式协调服务(如 ZooKeeper)使用。

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

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

相关文章

基于 Spring Boot 瑞吉外卖系统开发(十三)

基于 Spring Boot 瑞吉外卖系统开发(十三) 查询套餐 在查询套餐信息时包含套餐的分类名,分类名称在category表中,因此这里需要进行两表关联查询。 自定义SQL如下: select s.* ,c.name as category_name from setmeal…

POSE识别 神经网络

Pose 识别模型介绍 Pose 识别是计算机视觉领域的一个重要研究方向,其目标是从图像或视频中检测出人体的关键点位置,从而估计出人体的姿态。这项技术在许多领域都有广泛的应用,如动作捕捉、人机交互、体育分析、安防监控等。 Pose 识别模型的…

力扣119题:杨辉三角II(滚动数组)

小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。 标签: 杨辉三角、滚动数组 语言: C 题目: 给定一个非负索引 rowIndex,返回「杨辉三角…

大疆无人机(全系列,包括mini)拉流至电脑,实现直播

参考视频 【保姆级教程】大疆无人机rtmp推流直播教程_哔哩哔哩_bilibili VLC使用教程: VLC工具使用指南-CSDN博客 目录 实现效果: 电脑端 ​编辑 ​编辑 无人机端 VLC拉流 分析 实现效果: (实验机型:大疆mini4kRC-N2遥控器、大…

uniapp-商城-54-后台 新增商品(页面布局)

后台页面中还存在商品信息的添加和修改等。接下来我们逐步进行分析和展开。包含页面布局和数据库逻辑等等。 1、整体效果 样式效果如下,依然采用了表单形式来完成和商家信息差不多,但在商品属性上多做了一些弹窗等界面,样式和功能点表多。 …

WebpackVite总结篇与进阶

模块化 Webpack Webpack 入口entry 分离app和第三方库入口 这是什么? 这是告诉 webpack 我们想要配置 2 个单独的入口点(例如上面的示例)。 为什么? 这样你就可以在 vendor.js 中存入未做修改的必要 library 或文件&#xff0…

【python】基础知识点100问

以下是Python基础语法知识的30条要点整理,涵盖数据类型、函数、控制结构等核心内容,结合最新资料归纳总结: 基础30问 一、函数特性 函数多返回值 支持用逗号分隔返回多个值,自动打包为元组,接收时可解包到多个变量 def func(): return 1, "a" x, y = func()匿…

SpringBoot--springboot简述及快速入门

spring Boot是spring提供的一个子项目,用于快速构建spring应用程序 传统方式: 在众多子项目中,spring framework项目为核心子项目,提供了核心的功能,其他的子项目都需要依赖于spring framework,在我们实际…

vscode_python远程调试_pathMappings配置说明

1.使用说明 vscode python 远程调试pathMappings 配置 launch.json "pathMappings": [{"localRoot": "本地代码目录","remoteRoot": "远程代码目录" # 注意不是运行目录, 是远程代码的目录}],2.测试验证 测试目的: 远程代…

遨游5G-A防爆手机:赋能工业通信更快、更安全

在工业数字化转型与5G-A商用进程加速的双重驱动下,中国防爆手机市场正迎来历史性发展机遇。作为“危、急、特”场景通信解决方案服务商,遨游通讯深刻洞察到:当5G-A网络以超高速率、海量连接和毫秒级时延重塑行业生态时,防爆手机这…

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP(XD-MDPBm20)网关在Profibus总线侧实现主站功能,在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备(如:海…

「华为」人形机器人赛道投资首秀!

温馨提示:运营团队2025年最新原创报告(共210页) —— 正文: 近日,【华为】完成具身智能赛道投资首秀,继续加码人形机器人赛道布局。 2025年3月31日,具身智能机器人头部创企【千寻智能&#x…

格雷希尔G10和G15系列自动化快速密封连接器,适用于哪些管件的密封,以及它们相关的特性有哪些?

格雷希尔G10和G15系列快速密封连接器,用于自动化和半自动化过程中的外部或内部密封,通过使用气压驱动来挤压内部的密封圈,创造一个适用于各种管件的无泄漏密封连接,连接器内部的弹性密封圈可以提供其他产品不能提供的卓越密封性能…

专栏特辑丨悬镜浅谈开源风险治理之SBOM与SCA

随着容器、微服务等新技术日新月异,开源软件成为业界主流形态,软件行业快速发展。但同时,软件供应链也越来越趋于复杂化和多样化,软件供应链安全风险不断加剧。 软件供应链安全主要包括软件开发生命周期和软件生存运营周期&#x…

vue3项目创建-配置-elementPlus导入-路由自动导入

目录 方法一:create-vue 方法二 :Vite Vue Vite.config.ts配置 引入element-plus 安装 如何在项目中使用 Element Plus 完整引入 按需导入 vue3vite中自动配置路由的神器:vite-plugin-pages 1. 安装 2、修改vite.config.js中配置…

MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置

视频讲解: MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核,脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning ,有需要可以自行clon…

Innovus 25.1 版本更新:助力数字后端物理设计新飞跃

在数字后端物理设计领域,每一次工具的更新迭代都可能为项目带来巨大的效率提升与品质优化。今天,就让我们一同聚焦 Innovus 25.1 版本(即 25.10 版本)的更新要点,探寻其中蕴藏的创新能量。 一、核心功能的强势进 AI…

CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜

文章目录 一、引言二、系统架构设计2.1、整体架构概览2.2、数据库设计2.3、后端服务设计 三、实战:从零构建排行榜3.1、开发环境准备3.2、用户与战区 数据管理3.2.1、MySQL 数据库表创建3.2.2、实现用户和战区数据的 CURD 操作 3.3、实时分数更新3.4、排行榜查询3.5…

在线SQL转ER图工具

在线SQL转ER图网站 在数据库设计、软件开发或学术研究中,ER图(实体-关系图) 是展示数据库结构的重要工具。然而,手动绘制ER图不仅耗时费力,还容易出错。今天,我将为大家推荐一款非常实用的在线工具——SQL…

python高级特性

json.dumps({a:1,n:2}) #Python 字典类型转换为 JSON 对象。相当于jsonify data2 json.loads(json_str)#将 JSON 对象转换为 Python 字典 异步编程:在异步编程中,程序可以启动一个长时间运行的任务,然后继续执行其他任务,而无需等…