Redis - redis 为什么是单线程,为什么使用跳表作为索引?


单线程的redis为什么这么快

  1)绝大部分请求是纯粹的内存操作(非常快速);

  2)采用单线程,避免了不必要频繁的上下文切换和竞争条件;

  3)非阻塞I/O多路复用机制

对于大量的请求怎么样处理

  redis是一个单线程程序,也就是说同一时刻它只能处理一个客户端请求;
  redis是通过IO多路复用(select,epoll, kqueue,依据不同的平台,采取不同的实现)来处理多个客户端请求。

redis为什么使用跳表作为索引,不使用B+树

  因为B+树的原理是叶子节点存储数据,非叶子节点存储索引,B+树的每个节点可以存储多个关键字,它将节点大小设置为磁盘页的大小,充分利用了磁盘预读的功能。每次读取磁盘页时就会读取一整个节点,每个叶子节点还有指向前后节点的指针,为的是最大限度的降低磁盘的IO;

  而Redis是内存中读取数据,不涉及IO,因为数据在内存中读取耗费的时间是从磁盘的IO读取的百万分之一,因此使用了跳表,利用空间换时间的方式,实现简单,且能提高查询效率。

redis为什么使用跳表作为索引,不使用红黑树

  选择跳跃表而非红黑树作为有序集合实现方式的原因,并非是基于并发上的考虑,redis是单线程,仅仅是因为跳跃表的实现相较于红黑树更加简洁,内存占用更有优势

Redis 中的有序集合(Zset)支持的核心操作主要有以下几个:

  • 插入一个数据
  • 删除一个数据
  • 查找一个数据
  • 按照区间查找数据
  • 迭代输出有序序列

其中,插入、删除、查找以及迭代输出有序序列这几个操作,红黑树也可以完成,时间复杂度和跳表是一样的。

按照区间查找数据这个操作,红黑树的效率没有跳表高。跳表(查看实现原理)可以在 O(logn) 时间复杂度定位区间的起点,然后在原始链表中顺序向后查询就可以了,这样非常高效【空间换时间,增加多级索引,从上往下开始查找】。此外,相比于红黑树,跳表还具有代码更容易实现、可读性好、内存占用更有优势、不容易出错、更加灵活等优点,因此 Redis 用跳表来实现。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM