百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

一文带你彻底掌握Redis为什么这么快?

mhr18 2024-11-11 12:03 12 浏览 0 评论

一、Redis为什么这么快

因为Redis采取了epoll模型,IO多路复用。同步非阻塞。

二、什么是epoll

介绍epoll之前必须要先介绍下select和poll。明白select和poll的缺点后才能知道为什么epoll这么快。

三、什么是select

1、源码

2、源码解析

2.1、核心代码

// select(xx,读文件描述符集合,写文件描述符集合,异常文件描述符集合,超时时间),我们只需要关注读文件描述符集合,其他NULL不影响,因为有默认值。select(max+1, &rset, NULL, NULL, NULL)

2.2、&rset是什么?

rset其实就是fds(文件描述符的集合)。而select模型存储fds的方式是采取的bitmap,默认最大1024个。

2.3、执行流程

1.select模型每次都直接将rset(也就是fds)全部拷贝到内核态,因为内核态速度比用户空间态快很多。2.如果没数据的话,select函数会阻塞,如果有数据的话会执行两步(1)将有数据的那个fd置位(也就是标记一下,代表这个fd有数据)(2)select函数不在阻塞,将继续往下执行。也就是整体遍历fds,找到有数据的那个fd读取数据做处理。他的fd不能重用,每一次都需要重新创建新的fds且将用户空间态的fds拷贝到内核态。(这个可以看上面while(1)的代码)

3、缺点

  • fds最大支持1024个(可以更改,但是意义不大)
  • fd不可重用,每次内核态都给置位了,导致每次都需要重新执行如下四句话创建一个新的rset(也就是fds)
  • 用户控件态拷贝rset到内核态也需要时间,虽然内核态执行比用户态快,但是copy也需要开销
  • O(n)再次遍历问题。因为rset里的fd被置位后,select函数并不知道哪个被置位了,需要从头遍历到尾,逐个对比。

四、什么是poll

1、源码

2、源码解析

2.1、核心代码

// 代表传入了5个pollfd这个结构体,超时时间是5000,poll整体就是围绕他的pollfd这个结构体来展开的poll(pollfds, 5, 5000)

2.2、结构体

poll的结构体是为了fd重复利用,不需要每次都拷贝到内核态用的。


revents:置位用的,如果某个fd有数据了,就把这个revents置位为POLLIN

2.3、执行流程

  • 有数据的时候流程如下
  • 将pollfd这个结构体里的revents这个字段置位为POLLIN
  • 然后判断这个结构体的revents字段是不是被置位为POLLIN了,是的话再将其结构体的这个字段恢复默认值0,然后取出数据,处理逻辑。恢复为默认值0的用途是不需要在像select一样每次都需要重新创建fds,而是直接复用。但还是避免不了每个fd第一次复制一次。好的是不用每次都创建新的了。

3、解决了select哪些问题

  • 采取的链表存储,而不是bitmap,解决了1024长度限制问题
  • 采取结构体每次置位结构体内的revents字段,而不破坏fd本身,所以可重用,不需要每次都创建新的fd。

4、缺点

  • 用户控件态拷贝rset到内核态也需要时间,虽然内核态执行比用户态快,但是copy也需要开销
  • O(n)再次遍历问题。因为rset里的fd被置位后,select函数并不知道哪个被置位了,需要从头遍历到尾,逐个对比。

五、再谈epoll

0、概述

epoll的出现就是为了解决poll最后两个缺点的。

1、源码

2、源码解析

2.1、核心代码

epoll_create 相当于创建白板
epoll_ctl相当于往白板上写字,写的内容是一个fd、一个events结构体,events结构体跟pollfd的结构体很像。epoll_ctl执行完后就得到了epfd,epfd就是循环了五个fd-events放里面,每个fd都有events事件
epoll_wait

2.2、执行流程

  • epoll将fd放到了红黑树里,且不需要拷贝到内核态,因为他采取了“共享内存”的概念。(其实还是复制,只是复制采取了其他技术可以使开销极其的小)
  • epoll的置位是重排,比如五个fd, 1 2 3 4 5,1 3 5这三个fd有数据了,那么他会重排序,排成如下1 3 5 2 4。(也有的说是单独放到新的数组里)
  • 每一次置位nfds的值都+1。且会回调epoll_wait
  • 所以epoll_wait执行完会返回有几个fd有数据,那么下面的for直接遍历nfds次即可。解决了前面的两种O(n)。变成了O1

六、阻塞/非阻塞

用户进程通过调用select/poll/epoll去处理socket请求的时候, select/poll/epoll由于是阻塞的,所以导致用户进程阻塞;而select/poll/epoll处理的socket用的是非阻塞

七、再次分析Redis

比如三个redis-cli,假设2个redis-cli写入命令,select:那么select模型是轮询这三个redis-cli的fd,看哪个fd有消息,有的话读取处理消息。当他下次再写命令的时候还需要重新创建fd,然后复制到内核态然后再遍历全部。poll:那么poll模型是轮询这三个redis-cli的fd,看哪个fd有消息,有的话读取处理消息。下次再写入的时候还是遍历全局fd,看哪个fd有消息进行处理。省去了每次都创建新的fd且复制的过程。epoll:epoll就不轮询了,有消息进来后你通知我,我去处理你的消息,那些没消息的fd我不管。而且复制到内核态的过程我采取牛逼的技术让开销达到最小的极致。

八、总结

  • select、poll、epoll必须懂,redis面试90%问-

关注小编,更多干货!

相关推荐

Spring Boot3 连接 Redis 竟有这么多实用方式

各位互联网大厂的后端开发精英们,在日常开发中,想必大家都面临过系统性能优化的挑战。当系统数据量逐渐增大、并发请求不断增多时,如何提升系统的响应速度和稳定性,成为了我们必须攻克的难题。而Redis,这...

隧道 ssh -L 命令总结 和 windows端口转发配置

摘要:隧道ssh-L命令总结和windows端口转发配置关键词:隧道、ssh-L、端口转发、网络映射整体说明最近在项目中,因为内网的安全密级比较高,只能有一台机器连接内网数据库,推送...

火爆BOOS直聘的13个大厂Java社招面经(5年经验)助你狂拿offer

火爆BOOS直聘的13个大厂Java社招面经(5年经验)助你狂拿offer综上所述,面试遇到的所有问题,整理成了一份文档,希望大家能够喜欢!!Java面试题分享(Java中高级核心知识全面解析)一、J...

「第五期」游服务器一二三面 秋招 米哈游

一面下午2点,35分钟golang内存模型golang并发模型golanggc原理过程channel用途,原理redis数据结构,底层实现跳跃表查询插入复杂度进程,线程,协程kill原理除了kil...

RMQ——支持合并和优先级的消息队列

业务背景在一个项目中需要实现一个功能,商品价格发生变化时将商品价格打印在商品主图上面,那么需要在价格发生变动的时候触发合成一张带价格的图片,每一次触发合图时计算价格都是获取当前最新的价格。上游价格变化...

Redis 中的 zset 为什么要用跳跃表,而不是B+ Tree 呢?

Redis中的有序集合使用的是一种叫做跳跃表(SkipList)的数据结构来实现,而不是使用B+Tree。本文将介绍为什么Redis中使用跳跃表来实现有序集合,而不是B+Tree,并且探讨跳跃表...

一文让你彻底搞懂 WebSocket 的原理

作者:木木匠转发链接:https://juejin.im/post/5c693a4f51882561fb1db0ff一、概述上一篇文章《图文深入http三次握手核心问题【思维导图】》我们分析了简单的一...

Redis与Java整合的最佳实践

Redis与Java整合的最佳实践在这个数字化时代,数据处理速度决定了企业的竞争力。Redis作为一款高性能的内存数据库,以其卓越的速度和丰富的数据结构,成为Java开发者的重要伙伴。本文将带你深入了...

Docker与Redis:轻松部署和管理你的Redis实例

在高速发展的云计算时代,应用程序的部署和管理变得越来越复杂。面对各种操作系统、依赖库和环境差异,开发者常常陷入“在我机器上能跑”的泥潭。然而,容器化技术的兴起,尤其是Docker的普及,彻底改变了这一...

Java开发中的缓存策略:让程序飞得更快

Java开发中的缓存策略:让程序飞得更快缓存是什么?首先,让我们来聊聊什么是缓存。简单来说,缓存是一种存储机制,它将数据保存在更快速的存储介质中,以便后续使用时能够更快地访问。比如,当你打开一个网页时...

国庆临近,字节后端开发3+4面,终于拿到秋招第一个offer

字节跳动,先面了data部门,3面技术面之后hr说需要实习转正,拒绝,之后另一个部门捞起,四面技术面,已oc分享面经,希望对大家有所帮助,秋招顺利在文末分享了我为金九银十准备的备战资源库,包含了源码笔...

“快”就一个字!Redis凭什么能让你的APP快到飞起?

咱们今天就来聊一个字——“快”!在这个信息爆炸、耐心越来越稀缺的时代,谁不希望自己手机里的APP点一下“嗖”就打开,刷一下“唰”就更新?谁要是敢让咱用户盯着个小圈圈干等,那简直就是在“劝退”!而说到让...

双十一秒杀,为何总能抢到?Redis功不可没!

一年一度的双十一“剁手节”,那场面,简直比春运抢票还刺激!零点的钟声一敲响,亿万个手指头在屏幕上疯狂戳戳戳,眼睛瞪得像铜铃,就为了抢到那个心心念念的半价商品、限量版宝贝。你有没有发现一个奇怪的现象?明...

后端开发必看!为什么说Redis是天然的幂等性?

你在做后端开发的时候,有没有遇到过这样的困扰:高并发场景下,同一个操作重复执行多次,导致数据混乱、业务逻辑出错?别担心,很多同行都踩过这个坑。某电商平台就曾因订单创建接口在高并发时不具备幂等性,用户多...

开发一个app需要哪些技术和工具

APP开发需要一系列技术和工具的支持,以下是对这些技术的清晰归纳和分点表示:一、前端开发技术HTML用于构建页面结构。CSS用于样式设计和布局。JavaScript用于页面交互和逻辑处理。React...

取消回复欢迎 发表评论: