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 用跳表来实现。

posted @   李若盛开  阅读(1525)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示