首页 > 数据库 >关联:Redis I/O模式

关联:Redis I/O模式

时间:2023-06-08 16:23:02浏览次数:40  
标签:多路复用 epoll 单线程 Redis 模式 关联 IO cpu

Redis使用的是I/O多路复用

首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知程序进行相应的操作。 redis的io模型主要是基于epoll实现的,不过它也提供了 select和kqueue的实现,默认采用epoll 。

Redis 使用了单线程 IO 多路复用,为什么那么快?

1、cpu 处理相比于 IO 可以忽略

每个客户端建立连接时,都需要服务端为其 创建 socket 套接字,建立连接。然后该客户端的每个请求都要经历以下几步:

(1)等待请求数据数据从客户端发送过来

(2)将请求数据从内核复制到用户进程的缓冲区(buffer)

(3)对请求数据进行处理(对于 redis 而言,一般就是简单的 get/set)

由于操作简单+只涉及内存,所以第(3)步的处理很简单、很快,主要时间耗在(1)步,所以,如果采用普通 BIO 模式,每个请求都要经历这几步,那么处理十万条数据,就要在(1)步花费大量的时间,这样的话,qps 一定很低。所以就采用了更高效的 IO 多路复用模式

2、瓶颈在带宽,而不在 cpu

由于 数据存放在内存中+处理逻辑简单,导致即使是单线程,Redis 可支持的 qps 也相当大,而当 qps 相当大的时候,首先限制性能的是带宽,即不需要把 cpu 的性能挖掘出来,因为在这之前,带宽就不够用了。所以没有必要为了提高 cpu 利用率而使用多线程处理业务逻辑。

标签:多路复用,epoll,单线程,Redis,模式,关联,IO,cpu
From: https://www.cnblogs.com/yogayao/p/17466846.html

相关文章

  • Redis 面试题
    1.Redis是什么?Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。2.Redis有哪些数据类型?5种基础数据结构:String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Zset(有序集合)。3种特殊数据结构:HyperLogLogs(......
  • redis 安装fatal error: jemalloc/jemalloc.h: No such file or directory 错误
    转自;https://www.cnblogs.com/oxspirt/p/11392437.html 问题现象: 我第一次安装redis时,没有安装gcc,报错了,然后安装好gcc,后再次执行make命令,安装redis就出现了如上的错误 网上错误解决办法网上大部分解决办法都是错误的,如下文:(错误解决办法)makeMALLOC=libc正确解决......
  • Redis系列15:使用Stream实现消息队列(精讲)
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • 十、Redis主从复制
    读操作:主库、从库都可以接收;写操作:首先到主库执行,然后,主库将写操作同步给从库。主从第一次同步第一阶段,主从库间建立连接、协商同步的过程,主要是为全量复制做准备。从库和主库建立起连接,主库确认回复后,就可以开始同步了。具体来说,从库给主库发送psync命令,psync命令包含了......
  • 十一、Redis扩容如何保证哈希一致性
    横向扩容,保证哈希一致性一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形)下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置......
  • 十三、Redis并发竞争问题
    多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了首先使用分布式锁,确保同一时间,只能有一个系统实例在操作某个key然后修改key的值时,要先判断这值的时间戳是否比缓存里的值的时......
  • 五、Redis内存消耗
    从性能上来说,内存占用过高会引起Reids响应变慢从高可用上来说,内存过大可能会会引起部分数据丢失,故障恢复变慢Redis内存消耗主要在于其主进程消耗和子进程消耗。而主进程消耗又主要包括自身内存、对象内存、缓冲区内存、内存碎片五个方面1、自身内存指Redis进程自身所占用的内......
  • redis应用场景--记录文章,图文,或者视频的浏览次数
    在阅读博客文章时,你可以看到一篇文章被阅读的次数,如果使用mysql,那么在设计article表时,就必须设置一个view_count字段来记录这篇文章被阅读的次数。但这种方式相比于使用redis,并不是一种好的办法,原因在于,每次更新view_count字段的值都是一个比较费力的过程。首先,程序需要根据文......
  • 外观模式:隐藏了复杂系统的复杂性,并提供一个简单的接口来访问系统
    外观模式是一种结构型设计模式,它为复杂子系统提供了一个统一的接口,从而使其更易于使用。外观模式隐藏了子系统的复杂性,并将其封装在一个高级接口中。在使用外观模式时,客户端只需要与外观对象进行交互,而不需要直接与子系统中的各个组件交互。//子系统中的组件classCPU{pu......
  • redis应用场景--实现布隆过滤器
    简述布隆过滤器的实现思路:假设有一个长度为n的比特数组,bit_array,数组里的每一位都是0,对于一个url或者是其他数据,使用hash算法计算出url的散列值,这个散列值当然是一个整数,暂且命名为index,index=index%n,确保index的值小于n,查看bit_array[index]是否等于1,如果等于1,表示该url已......