第82篇 简谈Redis处置处罚为什么这么快?

打印 上一主题 下一主题

主题 950|帖子 950|积分 2850

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 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表