摘要:
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 阅读全文
摘要:
String是Redis中最常见的数据存储类型: 其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。 RedisObject的头和SDS是两个独立的内存空间 如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申 阅读全文
摘要:
RedisObject redis中的任意数据类型的键和值都会封装为一个RedisObject,也叫做Redis对象。 Redis对象头部占16个字节 (不包含指针指向的内存空间),所以大量数据使用的情况下,不推荐使用OBJ_STRING类型存储,用OBJ_LIST更好 Redis的编码方式 阅读全文