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 用跳表来实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」