论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
第82篇 简谈Redis处置处罚为什么这么快? ...
第82篇 简谈Redis处置处罚为什么这么快?
勿忘初心做自己
金牌会员
|
2024-12-9 21:44:07
|
显示全部楼层
|
阅读模式
楼主
主题
949
|
帖子
949
|
积分
2847
1.Redis为什么这么快?
完全基于内存,数据存在内存中
,绝大部门请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部门的开销。
数据布局简单,对数据操作也简单
。【Redis中的数据布局】是专门进行设计的,每种数据布局都有一种或多种数据布局来支持。Redis正是依赖这些灵活的数据布局,来提升读取和写入的性能。
采用单线程,省去了很多上下文切换的时间以及CPU消耗,
不存在竞争条件,不用去考虑各种锁的问题,不存在加锁释放锁操作,也不会出现死锁而导致的性能消耗。
Redis直接本身构建了VM 机制
,避免调用系统函数的时候,浪费时间去移动和请求
Redis 采用了 I/O 多路复用机制处置处罚大量的客户端 Socket 请求
,【IO 多路复用机制】是指一个线程处置处罚多个 IO 流,就是我们经常听到的 select/epoll 机制。简单来说,在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听 Socket 和已连接 Socket。内核会一直监听这些 Socket 上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处置处罚,这就实现了一个 Redis 线程处置处罚多个 IO 流的效果。
Redis 基于 Reactor 模式开辟了本身的网络事件处置处罚器,这个处置处罚器被称为文件事件处置处罚器 file event handler。由于这个文件事件处置处罚器是单线程的,以是Redis才叫做单线程的模型,但是它采用IO多路复用机制同时监听多个Socket,并根据Socket上的事件来选择对应的事件处置处罚器进行处置处罚。文件事件处置处罚器的布局包含4个部门,线程模型如下图:
多个 Socket 大概会产生差别的操作,每个操尴尬刁难应差别的文件事件,但是IO多路复用程序会监听多个Socket,将Socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处置处罚器进行处置处罚。
Redis客户端对服务端的每次调用都履历了发送下令,执行下令,返回结果三个过程。其中执行下令阶段,
由于Redis是单线程来处置处罚下令的,全部每一条到达服务端的下令不会立刻执行,全部的下令都会进入一个队列中,然后逐个被执行
。并且多个客户端发送的下令的执行顺序是不确定的。但是可以确定的是
不会有两条下令被同时执行,不会产生并发问题
,这就是Redis的单线程根本模型。
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,然后程序就会轮询一遍全部的流(epoll 是只轮询那些真正发出了事件的流),并且依次顺序的处置处罚就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处置处罚多个客户端的网络IO连接请求(尽量减少网络 IO 的时间消耗)
2.为什么Redis是单线程?
这里我们强调的单线程,指的是网络请求模块利用一个线程来处置处罚,即一个线程处置处罚全部网络请求,其他模块仍用了多个线程。
那为什么利用单线程呢?官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有大概是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
但是,我们利用单线程的方式是无法发挥多核CPU 性能,不外我们可以通过在单机开多个Redis 实例来解决这个问题
3.Redis6.0的多线程
1、Redis6.0 之前为什么一直不利用多线程?
Redis利用单线程的可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时大概存在线程切换、乃至加锁解锁、死锁造成的性能损耗。
2、Redis6.0 为什么要引入多线程呢?
因为Redis的瓶颈不在内存,而是在网络I/O模块带来CPU的耗时,以是Redis6.0的多线程是用来处置处罚网络I/O这部门,充实利用CPU资源,减少网络I/O阻塞带来的性能损耗。
4.多线程模式下,是否存在线程并发安全问题?
如图,一次redis请求,要建立连接,然后获取操作的下令,然后执行下令,末了将相应的结果写到socket上。
在redis的多线程模式下,获取、剖析下令,以及输出结果着两个过程,可以设置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是下令的执行,也就是内存操作,依然是单线程运行的。以是,Redis 的多线程部门只是用来处置处罚网络数据的读写和协议剖析,执行下令仍旧是单线程顺序执行,也就
不存在并发安全
问题。
出自:
https://www.cnblogs.com/seven97-top/p/18565578
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
勿忘初心做自己
金牌会员
这个人很懒什么都没写!
楼主热帖
新一代企业级安全OneDNS
记一次有意思的业务实现 → 单向关注是 ...
集合论第6-8章
DNS协议
Java 代理模式
SignalR 2 与mvc 5实现实时聊天功能 ...
反射 p1 反射机制
多维数组讲解
将git仓库从submodule转换为subtree ...
数字工厂介绍
标签云
挺好的
服务器
快速回复
返回顶部
返回列表