深度解析Redis线程模型设计原理(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云解析 DNS,旗舰版 1个月
简介: 深度解析Redis线程模型设计原理(上)

1 单线程模型设计

image.png

我们通常说Redis是单线程,主要指Redis的网络I/O和KV对读写是由一个线程完成,是Redis对外提供KV存储服务的主要流程。

但Redis其它功能如持久化、异步删除、集群数据同步等,是由额外线程执行的。


所以,严格来说,Redis并不是单线程,但一般把Redis称为单线程高性能,显得像 UC 编辑部。所以都说Redis是单线程模式。

为何单线程模型

要弄明白这个问题,需研究Redis的单线程设计机制以及多路复用机制。

调优Redis性能时,也能针对性避免会导致Redis单线程阻塞的操作,例如执行复杂度高命令。

多线程的开销

“使用多线程,可增加系统吞吐率或增加系统扩展性”。

一个多线程系统,在合理资源分配时,可增加系统中处理请求操作的资源实体,进而提升系统能够同时处理的请求数,即吞吐率。

左图是我们采用多线程时所期待的结果。

image.png

但通常情况用多线程后,若无良好系统设计,实际得到的结果,其实是右图那样。为什么会这样?‘

核心瓶颈在于,系统通常会存在被多线程同时访问的共享资源,如一个共享的数据结构。当多线程修改共享资源时,为保证共享资源正确性,就需额外机制保证,就直接带来额外开销。

比如Redis有List数据类型,并提供出队(LPOP)和入队(LPUSH)操作。假设Redis采用多线程设计,现有两个线程A、B:

A对一个List做LPUSH操作,并对队列长度加1

同时,线程B对该List执行LPOP操作,并对队列长度减1


为保证队列长度正确性,Redis要让线程A和B的LPUSH和LPOP串行执行,这样Redis可无误地记录它们对List长度修改。否则,可能得到错误结果。

这就是多线程编程面临的共享资源的并发访问控制问题。

image.png

如果无精心设计,比如只是简单采用一个粗粒度的互斥锁,就会出现不理想结果:即使增加了线程,大部分线程也在等待获取访问共享资源的互斥锁,并行变串行,系统吞吐率并没有随着线程的增加而增加。

也会引入同步原语保护共享资源的并发访问,降低系统代码的易调试性和可维护性。


为避免这些Redis直接单线程模式。


讲到这里,你应该已经明白了“Redis为什么用单线程”,那么,接下来,我们就来看看,为什么单线程Redis能获得高性能。


纯内存操作

基于非阻塞的IO多路复用机制

避免了多线程的频繁上下文切换

2 文件事件处理器

Redis 基于 Reactor 模式开发了自己的网络事件处理器 - 文件事件处理器(file event handler,后文简称为 FEH),而该处理器又是单线程的,所以redis设计为单线程模型。

采用I/O多路复用同时监听多个socket,根据socket当前执行的事件来为 socket 选择对应的事件处理器。

当被监听的socket准备好执行accept、read、write、close等操作时,和操作对应的文件事件就会产生,这时FEH就会调用socket之前关联好的事件处理器来处理对应事件。

所以虽然FEH是单线程运行,但通过I/O多路复用监听多个socket,不仅实现高性能的网络通信模型,又能和 Redis 服务器中其它同样单线程运行的模块交互,保证了Redis内部单线程模型的简洁设计。


下面讲讲文件事件处理器的几个组成部分。

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
8天前
|
机器学习/深度学习 人工智能 算法
模型无关的局部解释(LIME)技术原理解析及多领域应用实践
在当前数据驱动的商业环境中,人工智能(AI)和机器学习(ML)已成为各行业决策的关键工具,但随之而来的是“黑盒”问题:模型内部机制难以理解,引发信任缺失、监管合规难题及伦理考量。LIME(局部可解释模型无关解释)应运而生,通过解析复杂模型的个别预测,提供清晰、可解释的结果。LIME由华盛顿大学的研究者于2016年提出,旨在解决AI模型的透明度问题。它具有模型无关性、直观解释和局部保真度等优点,在金融、医疗等领域广泛应用。LIME不仅帮助企业提升决策透明度,还促进了模型优化和监管合规,是实现可解释AI的重要工具。
44 9
|
2天前
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
16 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
20天前
|
缓存 NoSQL Linux
redis的原理(三)
redis的原理(三)
redis的原理(三)
|
1天前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
12 2
|
1天前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
10 1
|
5天前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
23 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
20天前
|
存储 缓存 NoSQL
redis的原理(四)
redis的原理(四)
|
20天前
|
存储 缓存 NoSQL
redis的原理(二)
redis的原理(二)
|
20天前
|
缓存 NoSQL 安全
Redis的原理(一)
Redis的原理(一)
|
14天前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
30 0

推荐镜像

更多