【Redis】第3节|深入理解Redis线程模型

一、Redis基础认知

(一)定义与定位

Redis(Remote Dictionary Server)是开源高性能键值数据库,核心特点如下:

  • 数据结构丰富:支持字符串、哈希、列表、集合、有序集合等复杂数据类型,远超传统Key-Value存储范畴。
  • 内存存储与持久化:数据基于内存存储确保读写高性能,同时通过RDB(快照)和AOF(日志追加)实现持久化,可作为数据库使用。
  • 功能定位扩展:从单纯缓存发展为具备Cache(缓存)、Database(数据库)、Vector Search(向量搜索)的综合服务。

(二)2024年Redis生态

  • 产品体系
    • Redis Cloud:基于AWS、Azure等公有云的企业级云服务。
    • Redis Enterprise Software:企业级收费产品,支持高可用性和集群部署。
    • Redis Insight:官方图形化客户端与管理套件,简化运维操作。
    • Redis OSS & Stack:OSS为开源基础版,Stack是基于OSS的扩展技术栈,提供高级功能如向量搜索。

二、线程模型解析

(一)核心模型:客户端多线程+服务端单线程为主

  • 客户端:多线程维护Socket连接,通过maxclients配置最大连接数(默认10000)。
  • 服务端
    • 主线程:基于epoll实现IO多路复用,处理网络请求、键值读写等核心逻辑,确保指令串行执行,避免并发问题。
    • 后台线程(Redis6.x/7.x引入):异步处理持久化(RDB/AOF)、UNLINK删除、集群同步等耗时操作,减轻主线程压力。

(二)版本演进

  • Redis4.x前:纯单线程模型,所有操作由主线程完成。
  • Redis5.x后:重构线程模型,逐步引入后台线程处理非核心任务。
  • Redis7.x:支持多线程IO(通过io-threads配置),优化网络读写性能,但核心指令仍由主线程串行执行。

(三)单线程优势与挑战

  • 优势:避免线程上下文切换和资源竞争,简化编程模型,适合内存操作的高性能需求。
  • 挑战:无法充分利用多核CPU(需通过分片或多实例扩展),BigKey可能导致主线程阻塞。

三、指令原子性保证机制

(一)复合指令

  • MSETGETSETSETNX等,单个指令内部保证原子性,适用于简单场景。

(二)Redis事务(Transaction)

  • 流程MULTI开启事务→命令入队→EXEC执行/DISCARD放弃。
  • 特点
    • 命令按队列顺序执行,中间不会被其他客户端打断。
    • 不保证回滚:若事务执行中某命令出错(如类型不匹配),其他命令仍会执行,需手动处理异常。
    • Watch机制:通过WATCH key监控数据变化,若事务执行前key被修改,自动放弃事务,避免竞态条件。

(三)Pipeline(管道)

  • 原理:将多条命令打包批量发送,减少RTT(往返时间)消耗,提升批量操作效率。
  • 注意:不保证原子性,命令可能被其他客户端插入,适合非敏感数据的批量处理。

(四)Lua脚本

  • 原子性:脚本在服务端单线程执行,保证整体原子性,支持复杂逻辑(如条件判断、循环)。
  • 用法:通过EVAL script numkeys keys args执行,脚本中用redis.call调用Redis命令。
  • 优化:热点脚本可缓存到服务端(SCRIPT LOAD),减少重复传输开销。

(五)Redis Function(函数)

  • 定位:Redis7+引入,允许将Lua脚本封装为函数提前加载到服务端,客户端直接调用,提升代码复用性。
  • 限制:集群环境需手动在每个节点加载,不建议定义过大或过多函数。

四、BigKey问题与应对

(一)定义与影响

  • BigKey:占用内存大或元素数量多的键(如百万级元素的List),导致主线程阻塞、网络延迟增加。

(二)检测工具

  • redis-cli --bigkeys:抽样检测大键,显示各类型中占用最大的Key。
  • redis-cli --memkeys:按内存占用排序,定位内存大户。

(三)处理思路

  • 拆分:将大集合拆分为小分片(如按时间戳或ID取模)。
  • 优化数据结构:用更高效的结构替代(如用HyperLogLog统计基数,替代大集合)。
  • 定期监控:通过Redis监控工具(如RedisInsight、Prometheus)实时追踪Key大小。

五、总结:线程模型与性能优化要点

  1. 线程模型本质:服务端以单线程为主,通过IO多路复用和后台线程平衡性能与复杂度。
  2. 原子性方案选择
    • 简单场景:复合指令或事务。
    • 复杂逻辑:Lua脚本或Function。
    • 批量操作:Pipeline减少网络开销。
  3. 性能优化核心
    • 避免BigKey和慢指令(如KEYS *),定期清理无效数据。
    • 合理配置线程参数(如io-threads),结合多核CPU扩展。
    • 利用Redis生态工具(如Redis Cloud、Insight)实现监控与运维自动化。

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

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

相关文章

vben-admin 2.8.0 版本修改 axios响应处理逻辑

此前端框架下的 Axios 在后端返回的结果老是无法正常解析&#xff0c;找到他源码的封装类&#xff0c;修正这个问题 文件位于 src\utils\http\axios\index.ts 修改前 transformResponseHook: (res: AxiosResponse<Result>, options: RequestOptions) > {const { t }…

深入理解JavaScript设计模式之原型模式

目录 前言引入原型模式头脑风暴传统方式 vs 原型模式实战案例&#xff1a;飞机大战中的分身术 原型模式实现的关键秘密实战演练&#xff1a;造一架能分身的飞机克隆是创建对象的手段原型模式&#xff1a;轻装上阵的造物术 原型编程范型的一些规则原型编程的四大门规&#xff1a…

【数据库】概述(纯理论)

数据库系统引论 数据管理系统的发展 数据管理&#xff1a;对数据分类、组织、编码、存储、检索、维护 发展&#xff1a;人工管理、文件系统、数据库系统 40-50年代 人工管理 数据不保存&#xff0c;没有专门软件管理数据&#xff0c;应用程序完全依赖于数据&#xff0c;数据…

语音合成之十七 语音合成(TTS)中文自然度:问题、成因、解决方案

语音合成&#xff08;TTS&#xff09;中文自然度&#xff1a;问题、成因、解决方案 中文TTS系统基本架构中文TTS常见问题深度剖析与解决方案音色跳变成因分析解决方案 声调与重读错误成因分析业界解决方案 漏读与断句错误成因分析业界解决方案 在跨语言TTS系统比较中&#xff0…

我在 Linux 进程管理中踩过的坑:僵尸、瞬时与不可中断进程实战实录

作为运维老鸟&#xff0c;我曾在 Linux 进程管理上栽过不少跟头。记得第一次遇到满屏僵尸进程时&#xff0c;服务器直接卡到连 SSH 都登不上&#xff0c;看着ps命令里一排排刺眼的Z状态进程&#xff0c;手心直冒冷汗。后来又碰到过瞬时进程搞崩日志系统&#xff0c;明明监控显示…

【设计模式】简单工厂模式,工厂模式,抽象工厂模式,单例,代理,go案例区分总结

工厂模式三种类型&#xff1a; 一、简单工厂模式&#xff08;Simple Factory&#xff09; 定义&#xff1a; 用一个工厂类&#xff0c;根据传入的参数决定创建哪一种具体产品类实例。 面试说法&#xff1a; 由一个统一的工厂创建所有对象&#xff0c;增加新产品时需要修改工…

某标杆房企BI平台2.0升级实践

当房地产行业从“规模竞赛”转向“精益运营”&#xff0c;数字化转型成为破局关键。某千亿房企携手亿信华辰&#xff0c;以“用数据重构业务价值链”为目标&#xff0c;历经6个月完成BI平台战略性升级。在这场从“数据可视化”到“决策智能化”的跃迁中&#xff0c;亿信华辰ABI…

Lua 脚本在 Redis 中的运用-24 (使用 Lua 脚本实现原子计数器)

实践练习:使用 Lua 脚本实现原子计数器 实现原子计数器是许多应用程序中的常见需求,例如跟踪网站访问量、限制 API 请求或管理库存。虽然 Redis 提供了 INCR 命令用于递增整数,但在复杂场景或与其他操作结合时直接使用它可能并不足够。本课程探讨了如何在 Redis 中利用 Lua…

Rust 学习笔记:使用迭代器改进 minigrep

Rust 学习笔记&#xff1a;使用迭代器改进 minigrep Rust 学习笔记&#xff1a;使用迭代器改进 minigrep不使用 clone&#xff0c;而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记&#xff1a;使用迭代器改进 minigrep 前情提要&#xff1…

el-table配置表头固定而且高度变化

根据官网提示只要在 el-table 元素中定义了 height 属性&#xff0c;即可实现固定表头的表格&#xff0c;而不需要额外的代码。 如果你想既要固定表头&#xff0c;又要下方表格高度自适应&#xff0c;可以设置为 height"100%" &#xff1a; 然后外层设置scroll:

弱光环境下如何手持相机拍摄静物:摄影曝光之等效曝光认知

写在前面 博文内容为一次博物馆静物拍摄笔记的简单总结内容涉及&#xff1a;弱光环境拍摄静物如何选择&#xff0c;以及等效曝光的认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我看远山&#xff0c;远山悲悯 持续分享技术干货&#xff0c;感兴趣小伙伴可以关注下 _ 采…

ARM笔记-ARM伪指令及编程基础

第四章 ARM伪指令及编程基础 4.1 伪指令概述 4.1.1 伪指令定义 人们设计了一些专门用于指导汇编器进行汇编工作的指令&#xff0c;由于这些指令不形成机器码指令&#xff0c;它们只是在汇编器进行汇编工作的过程中起作用&#xff0c;所以被叫做伪指令。 4.1.2 伪指令特征 …

智能手表怎么申请欧盟EN 18031认证

智能手表申请欧盟 EN 18031 认证&#xff08;针对消费类物联网设备的网络安全标准&#xff09;的流程与智能门锁类似&#xff0c;但需结合手表的功能特性&#xff08;如数据交互、定位、支付等&#xff09;调整合规重点。以下是具体流程和关键要点&#xff1a; 一、标准适配与…

算法-全排列

1、全排列函数的使用 举例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

面试加分秘籍:校招数据倾斜场景下的SQL优化方案

校招面试经常会问大家有没有过调优的经验&#xff0c;相信大家的回答基本都是往数据倾斜和小文件问题这两方面回答&#xff0c;对于数据倾斜相信大部分同学对热key打散或null值引发的倾斜已经非常熟悉&#xff0c;但这些内容面试官也是听腻了&#xff0c;希望大家在面试时候讲一…

Elasticsearch索引机制与Lucene段合并策略深度解析

引言 在现代分布式搜索引擎Elasticsearch中&#xff0c;文档的索引、更新和删除操作不仅是用户交互的核心入口&#xff0c;更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开&#xff1a; 文档生命周期管理&#xff1a;从客户端请求路由到分片定位&#xff0c;从内存…

git提交更改

第一步&#xff1a;添加改动 git add . 第二步&#xff1a;提交改动 git commit -m “替换了 SerialPort 库文件” 第三步&#xff1a;推送到远程 git push 为什么git 的UI界面做的远不如SVN

WPF的基础控件:布局控件(StackPanel DockPanel)

布局控件&#xff08;StackPanel & DockPanel&#xff09; 1 StackPanel的Orientation属性2 DockPanel的LastChildFill3 嵌套布局示例4 性能优化建议5 常见问题排查 在WPF开发中&#xff0c;布局控件是构建用户界面的基石。StackPanel和DockPanel作为两种最基础的布局容器&…

互联网大厂Java求职面试:AI大模型推理服务性能优化与向量数据库分布式检索

互联网大厂Java求职面试&#xff1a;AI大模型推理服务性能优化与向量数据库分布式检索 面试现场&#xff1a;技术总监的连环追问 技术总监&#xff1a;&#xff08;翻看着简历&#xff09;郑薪苦&#xff0c;你在上一家公司参与过LLM推理服务的性能优化项目&#xff1f;说说你…

如何解决网站服务器的异常问题?

当网站服务器出现异常情况&#xff0c;导致用户无法正常访问网页信息的时候&#xff0c;该如何解决这一问题呢&#xff1f;小编下面就带领大家共同探讨一下这一问题。 企业在面对网站服务器异常时&#xff0c;首先要对服务器硬件设备进行详细的检查&#xff0c;可以使用硬盘检测…