Redis 实现原理或机制
Redis 是一个高性能的、基于内存的键值对存储系统,广泛用于缓存、会话管理、排行榜和消息队列等场景。它的高效性得益于其独特的实现原理和机制,Redis支持丰富的数据结构和多种持久化、复制、集群和发布/订阅功能,提供了灵活性和高可用性。
一、数据存储与内存管理
Redis 是一个完全基于内存的数据存储系统,所有的数据都保存在内存中,这使得其读写操作非常快。Redis 主要通过以下几个机制来实现高效的内存管理:
1. 内存分配机制
Redis 使用了 Jemalloc 作为其默认的内存分配器。Jemalloc 是一个内存管理库,适用于高并发、多线程的场景。它能够高效管理不同大小的内存块,减少内存碎片并提高内存分配效率。
Redis 使用 Jemalloc 的原因在于,它能够优化频繁的内存分配与释放操作,减少由于内存碎片化带来的性能下降。
2. 内存数据存储
Redis 所有数据都保存在内存中,其设计理念是“读写速度优先”。键值对和各种数据结构(如列表、集合等)都存储在内存中,这使得 Redis 的数据访问具有极快的速度。
同时,Redis 提供了多种内存优化手段,如:
- 压缩数据结构:Redis 会对某些数据结构进行压缩存储,节省内存空间。例如,较短的字符串会使用专门的内部编码来减少内存占用。
- 内存淘汰机制:当 Redis 内存达到配置的上限时,可以启用内存淘汰策略,如 LRU(最近最少使用)、LFU(最近最少使用频率)等,来自动删除部分旧数据,为新数据腾出空间。
二、数据结构
Redis 不仅仅是一个简单的键值对存储,它支持多种复杂的数据结构。Redis 的数据结构是在内存中高效实现的,以下是 Redis 主要支持的数据结构及其内部实现:
1. 字符串(String)
字符串是 Redis 中最基本的数据类型,可以存储文本、二进制数据、整数和浮点数。字符串的值最大可以是 512 MB。Redis 的字符串实际上是一个动态字符串(类似于C语言的 char*
),根据需要自动调整大小。
- 当字符串长度较短时,Redis 使用
SDS(Simple Dynamic String)
来管理内存,具有灵活的扩展机制。 - 支持原子操作,如自增、自减等。
2. 列表(List)
列表是一个双向链表,支持高效的头部和尾部插入与删除操作。它主要用于消息队列等场景。
- Redis 使用链表(
quicklist
)来实现列表,能够在链表和数组之间进行优化,既能提供快速的插入删除,也能节省内存。 - 典型的操作如
LPUSH
、RPUSH
(插入)、LPOP
、RPOP
(弹出)都是 O(1) 复杂度。
3. 集合(Set)
集合是一个无序的键值对集合,不允许有重复元素。集合在内部使用哈希表(Hash Table)来实现,具有 O(1) 的插入和查找时间复杂度。
- 适合存储不重复的数据,常用于标签系统、去重操作等。
- 支持交集、并集、差集等集合操作。
4. 有序集合(Sorted Set)
有序集合类似于集合,但每个元素都有一个关联的分数(score)。Redis 通过分数来自动对集合中的元素进行排序。
- 有序集合的实现是一个跳表(SkipList)加哈希表(Hash Table)的组合,能够在 O(logN) 时间复杂度下进行插入、删除、更新和范围查询。
- 常用于排行榜、延迟队列等场景。
5. 哈希表(Hash)
哈希表是一个键值对的集合,适合存储对象类型的数据。
- 内部实现是一个哈希表结构(类似于Python的字典),并对小量数据进行优化存储。
- 常用于存储用户信息、配置项等。
6. 位图(Bitmap)
Redis 还支持基于字符串实现的位图操作。通过位运算,Redis 可以高效地存储和操作大量二进制数据,适用于实现布隆过滤器或用户行为统计。
7. HyperLogLog
HyperLogLog 是一种基于概率的数据结构,用于统计海量数据的基数(如统计独立访问者数)。它占用空间非常小,但代价是结果是近似值。
三、持久化机制
Redis 虽然是内存数据库,但为了防止数据丢失,提供了持久化功能。Redis 支持两种持久化方式:RDB快照(Redis Database File) 和 AOF日志(Append Only File)。
1. RDB(Redis DataBase)
RDB 是 Redis 的一种快照持久化机制,它会定期将数据的快照保存到磁盘上,形成一个 .rdb
文件。RDB 是一个紧凑的二进制文件,备份和恢复速度很快。
- 优点:生成的文件体积较小,适合做数据备份。RDB恢复数据速度快。
- 缺点:快照是定时生成的,如果在快照生成之间发生了故障,可能会丢失部分数据。
RDB 触发机制:
- 定期触发:通过配置
save
规则指定每隔一段时间进行持久化。 - 手动触发:通过
SAVE
和BGSAVE
命令手动生成快照。
2. AOF(Append Only File)
AOF 是 Redis 另一种持久化机制,记录每一条写操作的日志。当 Redis 重启时,AOF 文件可以重放日志命令恢复数据。
- 优点:相比 RDB,AOF 提供了更高的持久性,日志写入的频率可调,如每秒同步(
fsync=everysec
)。 - 缺点:AOF 文件相比 RDB 会更大,恢复速度慢于 RDB。
AOF 的写入策略有三种:
- 每次写入 fsync:每次有写操作时立即将日志刷入磁盘,保证数据不会丢失,但性能较低。
- 每秒 fsync:每秒同步一次,性能和数据安全性折衷。
- 不 fsync:由操作系统控制日志写入磁盘的时间,性能最好,但数据可能丢失。
四、主从复制与高可用
Redis 支持主从复制机制,可以实现数据的同步和高可用性。主从复制允许多个 Redis 实例之间的数据同步,从而保证数据冗余,提高系统的可用性。
1. 主从复制(Replication)
Redis 的主从复制是异步的,主服务器负责处理写操作,从服务器负责备份和处理只读查询请求。
- 主库(Master):负责处理所有写操作。
- 从库(Slave):通过复制主库的数据,保持数据一致性,并可分担读请求。
主从复制的优势包括:
- 提高可用性:从库可在主库发生故障时接管。
- 分担负载:从库可以处理读操作,减少主库压力。
- 数据备份:从库实时备份主库的数据,防止数据丢失。
2. 哨兵(Sentinel)
Redis 哨兵是 Redis 的高可用解决方案,负责监控主从复制的健康状态,自动完成故障切换。当主库发生故障时,哨兵系统会自动选择一个从库作为新的主库,保证系统的高可用性。
- 哨兵不仅负责故障检测,还可以自动将客户端指向新的主库,保证业务的持续运行。
- 哨兵系统由多个哨兵节点组成,它们协同工作以确保一致性。
五、Redis 集群
当单台 Redis 实例的容量和性能不足以支持业务需求时,可以使用 Redis Cluster 来构建分布式 Redis 集群。Redis Cluster 通过**分片(sharding)**将数据分散到不同节点上,从而实现水平扩展。
Redis Cluster 的特点:
- 无中心化设计:没有单点故障,所有节点都可以提供读写服务。
- 数据分区:通过哈希槽(Hash Slot)机制,将整个键空间分为 16384 个槽,每个节点负责一部分槽的数据。
- 高可用性
:支持主从复制,当主节点发生故障时,集群可以自动将从节点提升为主节点。
Redis Cluster 通过合理的分片机制和节点间的通信,能够在极大提升存储和处理能力的同时保证数据的一致性和可用性。
总结
Redis 的高性能、高可用性和灵活性来自其精巧的实现原理和机制。通过高效的内存管理、灵活的数据结构、强大的持久化机制、主从复制和集群功能,Redis 能够满足各种复杂的应用场景需求。无论是在缓存、会话管理、还是分布式存储领域,Redis 都能够提供卓越的性能和稳定性。
相关文章:
Redis 实现原理或机制
Redis 是一个高性能的、基于内存的键值对存储系统,广泛用于缓存、会话管理、排行榜和消息队列等场景。它的高效性得益于其独特的实现原理和机制,Redis支持丰富的数据结构和多种持久化、复制、集群和发布/订阅功能,提供了灵活性和高可用性。 …...

使用程序方式获取与处理MySQL表数据
8.1 执行多条语句获取 MySQL 表数据 8.1.1 MySQL 中的常量 8.1.2 MySQL 中的变量 1.用户变量 用户可以在表达式中使用自己定义的变量,这样的变量称为用户变量。 用户变量在使用前必须定义和初始化,如果使用没有初始化的变量&#x…...

计算机网络(五) —— 自定义协议简单网络程序
目录 一,关于“协议” 1.1 结构化数据 1.2 序列化和反序列化 二,网络版计算器实现准备 2.1 套用旧头文件 2.2 封装sock API 三,自定义协议 3.1 关于自定义协议 3.2 实现序列化和反序列化 3.3 测试 三,服务器实现 3.1…...
开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十七)
一、前言 本篇文章将在v100单卡服务器上,使用unsloth去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 使用unsloth能够使模型的微调速度提高 2 - 5 倍。在处理大规模数据或对时间要求较高的场景下,…...

[数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):138 标注数量(xml文件个数):138 标注数量(txt文件个数):138 标注类别…...
Delphi 的 RSA 库 LockBox
LockBox 是用于 Delphi 的一套加密/解密控件 最早是一套商业控件,后来开源了。再后来,又有一个新版本的 LockBox,和旧版本完全不同。 旧版本的 LockBox 叫 LockBox 2;新版本的叫 LockBox 3。 这两个控件,都可以通过…...
element UI学习使用(1)
https://element.eleme.cn/2.6/#/zh-CN/component/container vue模块库,可复制直接使用 1、搜索框、下拉搜索框 <el-form :inline"true" class"demo-form-inline"><el-form-item label"结果搜索"><el-inputplaceho…...

如何搞定日语翻译?试试这四款工具
写一篇字数800-1000字的软文,用翻译新手的角度分享福昕翻译在线、福昕翻译客户端、海鲸AI翻译以及彩云翻译在翻译日语时候的表现,要求口语化表达。 最近对于一些轻小说突然感兴趣了,所以我开始尝试各种翻译工具来帮助我搞定日语翻译。今天&am…...

【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
本篇文章是对STM32单片机“独立看门狗(IWDG)”的原理进行讲解。希望我的分享对你有所帮助! 目录 一、什么是独立看门狗 (一)简介 (二)、独立看门狗的原理 (三)、具体操…...
前端框架大观:探索现代Web开发的基石
目录 引言 一、前端框架概述 二、主流前端框架介绍 2.1 React 2.1.1 简介 2.1.2 特点 2.1.3 代码示例 2.2 Vue.js 2.2.1 简介 2.2.2 特点 2.2.3 代码示例 2.3 Angular 2.3.1 简介 2.3.2 特点 2.3.3 代码示例 三、其他前端框架与库 四、前端框架的选择 五、结…...

16 训练自己语言模型
在很多场景下下,可能微调模型并不能带来一个较好的效果。因为特定领域场景下,通用话模型过于通用,出现多而不精。样样通样样松;本章主要介绍如何在特定的数据上对模型进行预训练; 训练自己的语言模型(从头开…...

udp网络通信 socket
套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种: 域间套接字:实现主机内部的进程通信的编程 …...
LG AI研究开源EXAONE 3.0:一个7.8B双语语言模型,擅长英语和韩语,在实际应用和复杂推理中表现出色
EXAONE 3.0介绍:愿景与目标 EXAONE 3.0是LG AI研究所在语言模型发展中的一个重要里程碑,特别是在专家级AI领域。 “EXAONE”这个名称源自于“ EX pert A I for Every ONE”,反映了LG AI研究所致力于将专家级别的人工智能能力普及化的承诺。这…...

【mysql】mysql之主从部署以及介绍
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具
关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具,旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器,该解析器处理标记化和语法树解析以及众多自定义属性&#x…...
QT 读取Excel表
一、QAxObject 读取excel表的内容,其仅在windows下生效,当然还有其他跨平台的方案。 config qaxcontainer #include <QAxObject>QStringList GetSheets(const QString& strPath) {QAxObject* excel new QAxObject("Excel.Application&…...
深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用20240909
深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用 在前端开发中,样式的管理与组件化开发之间的平衡一直是一个难题。Vue.js 提供了一些强大的工具来帮助开发者在开发复杂的应用时管理样式。这篇文章将详细介绍 Vue 中的 scoped、:deep() 和…...

C语言内存函数(21)
文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始,发车! 一、memcpy的使用和模拟实现 函数模型:void* memcpy(void* destination, const void* source, size…...
三高基本概念之-并发和并行
并行和并发是计算机科学中两个重要但容易混淆的概念,它们之间的主要区别可以从以下几个方面进行阐述: 一、定义与含义 并行(Parallel):并行是指两个或多个事件在同一时刻发生,即这些事件在微观和宏观上都…...

宝塔面板FTP连接时“服务器发回了不可路由的地址。使用服务器地址代替。”
参考 https://blog.csdn.net/neizhiwang/article/details/106628899 错误描述 我得服务器是腾讯,然后使用宝塔建了个HTML网站,寻思用ftp上传,结果报错: 状态: 连接建立,等待欢迎消息... 状态: 初始化 TLS 中... 状…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...