Redis 采用单线程快的原因有如下几个。
1、纯内存操作
Redis 是一个内存数据库,它的数据都存储在内存中,这意味着我们读写数据都是在内存中完成,速度非常快。
同时,Redis 也是一个 KV 内存数据库,它内部构建了一个哈希表,根据指定的 key 访问时,只需要O(1)
的时间复杂度就可以找到对应的数据。
2、 I/O 多路复用
Redis 是需要处理多个客户端连接的,使用 I/O 多路复用技术。Redis 可以同时监控多个客户端连接的 I/O 状态,不需要为每个连接新建一个线程(复用),这大大减少了资源的开销。
Redis 在单线程中监听多个 Socket 请求,非阻塞IO 内部实现采用 epoll ,利用 epoll+自己实现的简单的事件框架(文件事件处理器),将客户端的读写操作都转化成了事件。利用 epoll的多路复用特性,绝不在I/O上浪费一点时间。
Redis 利用了IO多路复用技术的事件驱动模型减少了创建线程的开销,避免了多线程的上下文切换开销,这使得 Redis 能够轻松地处理大量并发连接。
3、精心设计的数据结构
Redis 设计了多种高效的数据结构,如字符串、哈希表、有序集合等。这些数据结构都被实现得非常高效,使得 Redis 能够以 O(1)
复杂度执行一些常见操作,如读取、写入、查找和删除。
还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
这些高效的数据结构是 Redis 能够快速处理数据请求的重要原因之一。
4、单线程的优势
单线程的优势有如下几个:
- 没有多线程上下文切换的性能损耗
- 没有访问共享资源加锁的性能损耗
- 模型更加简单,可维护性叫搞
5、Redis 6.0 引入多线程
我们要明白一点,Redis 的性能从来都不是 CPU,而是 I/O 和 内存。随着底层网络硬件越来越好,Redis 的性能瓶颈逐渐体现在网络 I/O 的读写上,单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。所以为了提高 Redis 的性能,在 Redis 6.0 引入多线程模型,该多线程模型只用来处理网络数据的读写和协议解析,执行读写命令的仍然是单线程。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。