03 2024 档案
摘要:Redis内存回收 Redsi之所以性能强,最主要的原因就是基于内存存储。然而单节点的redis其内存大小不宜过大,会影响持久化或者主从同步性。 我们可以通过修改配置文件来设置redis的最大内存: 当内存使用达到上限时,就无法存储更多数据了 过期策略 在学习redis缓存的时候我们说过,可以通过e
阅读全文
摘要:Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub): ① 客户端(client)向服务端(server)发送一条命令 ② 服务端解析并执行命令,返回响应结果给客户端 因此客户端发送命令的格式、服务端相应结果的格式必须有一个规范,这个规范就是通讯协议。 而在Redi
阅读全文
摘要:Redis网络模型 Redis通过IO多路复用来提高网络性能,并且支持各种不同的多路复用实现,并且将这些实现进行封装,提供了统一的高性能事件库API库AE: ae.c对当前的系统环境做一个判断 来看下Redis单线程网络模型的整个流程 Redis 6.0版本中引入了多线程,目的是为了提高IO读写效率
阅读全文
摘要:Redis是单线程还是多线程? Redis到底是单线程还是多线程? 如果仅仅聊Redis的核心的业务处理部分(命令处理),答案是单线程 如果是聊整个Redis那么答案是多线程 在Redis版本迭代过程中,在两个重要的时间节点上引入了多线程的支持: Redis v4.0:引入多线程异步处理一些耗时较长
阅读全文
摘要:信号驱动IO 信号驱动IO是与内核建立SIGIO的信号关联并设置回调,当内核有FD就绪时,会发出SIGIO信号通知用户,期间用户应用可以执行其它业务,无需阻塞等待 缺点: 当有大量IO操作时,信号较多,SIGIO处理函数不能及时处理可能导致信号队列溢出 而且内核空间与用户空间的频繁信号交互性能也较低
阅读全文
摘要:基于epoll的服务端流程 基于epoll模式的web服务的基本流程图:
阅读全文
摘要:epoll事件通知机制 当FD有数据可读时,我们调用epoll_wait就可以得到通知。但是事件通知的模式有两种: LevelTriggered:简称LT。当FD有数据可读时,会重复通知多次,直到数据处理完成。是epoll的默认模式。 EdgeTriggered:简称ET。当FD有数据可读时,只会被
阅读全文
摘要:Epoll epoll模式是对select和poll的改进,它提供了三个函数: Epoll有没有解决之前select或者poll的问题? select或者poll把要监听的数组或集合拷贝到内核空间,等待FD就绪,就绪后,还要拷贝回用户空间。 epoll把select函数的功能拆分开了,建立event
阅读全文
摘要:Poll Poll模式对select模式做了简单改进,但性能提升不明显,部分关键代码如下: 如果设置超时时间,当超时时间过了,pollfd的fd没有就绪,revents就会赋值为0 IO流程: ① 创建pollfd数组,向其中添加关注的fd信息,数组大小自定义 ② 调用poll函数,将pollfd数
阅读全文
摘要:Select select是Linux中最早的I/O多路复用实现方案: nfds是FD遍历的一个上限,遍历到这个值的时候,就意味着不用再往后去遍历了。 fds_bits 是存储1024个比特位,代表1024个fd,这个数量是__d_mask四个字节共32个比特位乘以fds_bits的32长度得到的
阅读全文
摘要:无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案: 如果调用recvfrom时,恰好没有数据,阻塞IO会使进程阻塞,非阻塞IO使CPU空转,都不能充分发挥CPU的作用。 如果调用recvfrom时,恰好有数据,则用户进程可以直接进入第二阶
阅读全文
摘要:阻塞IO 顾名思义,阻塞IO就是两个阶段都必须阻塞等待: 调用revfrom函数的时候,内核没有数据,有两种处理结果,一个是返回失败的信息,一个是等待,而阻塞IO的选择是等待。 可以看到,阻塞IO模型中,用户进程在两个阶段都是阻塞状态。 非阻塞IO 顾名思义,非阻塞IO的recvfrom操作会立即返
阅读全文
摘要:服务器大多采用Linux系统,所以以Linux为例: 任何Linux发行版,其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互。 用户应用是无法直接访问计算机硬件,只能访问内核,基于内核操作计算机硬件 为了避免用户应用导致冲突甚至内核崩溃,用户应用与内核是分离的: l 进程的寻址
阅读全文
摘要:Hash Hash结构与Redis中的Zset非常类似: l 都是键值存储 l 都需要根据键获取值 l 键必须唯一 区别如下: l zset的键是member,值是score;hash的键和值都是任意值 l zset要根据score排序,hash则无需排序 因此,Hash底层采用的编码与Zset也基
阅读全文
摘要:ZSet也就是SortedSet,其中每一个元素都需要制定一个score值和member值: 可以根据score值排序 member必须唯一 可以根据member查询分数 因此,zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的那种编码结构可以满足? SkipList:可
阅读全文
摘要:Set是Redis中的单列集合,满足下列特点: 不保证有序性 保证元素唯一(可以判断元素是否存在) 求交集、并集、差集 以上操作,都需要判断元素是否存在,因此可以看出,Set对查询元素的效率要求非常高 Set是Redis中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求极高。 为了查询效率
阅读全文
摘要:List Redis的List类型可以从首、尾操作列表中的元素: 哪一个数据结构能满足上述特征? LinkedList: 普通链表,可以从双端访问,内存占用较高,内存碎片较多 ZipList: 压缩列表,可以从双端访问,内存占用低,存储上限低 QuickList: LinkedList+ZipLis
阅读全文