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 引入多线程模型,该多线程模型只用来处理网络数据的读写和协议解析,执行读写命令的仍然是单线程。