官方解析
Redis 之所以快,主要有以下几个方面的原因:
-
内存存储:Redis 的数据都是存储在内存中的,相比于硬盘存储的数据库,内存存储速度更快。
-
单线程模型:Redis 使用单线程模型处理所有的请求,避免了多线程之间的线程切换和竞争等开销,提高了处理请求的效率。
-
非阻塞 I/O:Redis 使用非阻塞 I/O 处理网络通信,当一个客户端请求到来时,Redis 不会一直等待客户端的响应,而是会先处理其它的请求,这样就避免了 I/O 阻塞带来的性能问题。
-
精简高效的数据结构:Redis 内置了多种高效的数据结构,如哈希表、跳表等,这些数据结构的实现非常精简高效,减少了 Redis 对内存和 CPU 的占用,从而提高了 Redis 的性能。
-
持久化策略:Redis 支持多种持久化策略,如 RDB(快照)和 AOF(追加式文件)等,这些策略可以将内存中的数据保存到硬盘中,以保证数据的持久性和安全性。同时,Redis 可以将数据以压缩的方式存储在硬盘中,减少了硬盘的占用,提高了数据的读写速度。
综上所述,Redis 之所以快,主要得益于其内存存储、单线程模型、非阻塞 I/O、高效的数据结构和灵活的持久化策略等方面的设计和实现。
1、纯内存操作
Redis 是基于内存的数据存储系统,绝大部分请求是纯粹的内存操作。
2、单线程操作,避免了频繁的上下文切换
Redis 的单线程操作是指,Redis 使用一个主线程来处理所有的客户端请求和数据操作,不会创建新的线程来处理请求。这种单线程模型的优点是可以避免多线程并发访问共享数据时的竞争和死锁问题,从而提高了 Redis 的性能和稳定性。此外,由于 Redis 的内存访问速度非常快,因此单线程处理请求也能够保证足够的性能。
3、采用了非阻塞 I/O 多路复用机制
为了实现单线程模型,Redis 使用了 IO 多路复用技术。IO 多路复用是指操作系统提供的一种 IO 模型,可以让一个进程同时监听多个 IO 事件(如读写事件),并在有事件发生时通知进程,从而实现并发处理 IO 事件。
具体来说,在 Redis 中,客户端的请求是由一个单线程来处理的,而 IO 操作却是通过 epoll 多路复用技术实现的。
Redis 单线程情况下,内核会一直监听 socket 上的连接请求或者数据请求,一旦有请求到达就交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。
select/epoll 提供了基于事件的回调机制,即针对不同事件的发生,调用相应的事件处理器。所以 Redis 一直在处理事件,提升 Redis 的响应性能。
Redis
-
核心业务部分(处理命令)使用的是单线程
-
抛开持久化不谈,Redis 是纯内存操作,执行速度非常快,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘 IO 读取到内存这部分的开销。
-
数据结构简单,对数据操作也简单。Redis 中的数据结构是专门进行设计的,每种数据结构都有一种或多种数据结构来支持。Redis 正是依赖这些灵活的数据结构,来提升读取和写入的性能。
-
使用基于 IO 多路复用机制的线程模型,可以处理并发的链接。
-
redis6.0 后引入多线程,因为 Redis 的瓶颈不在内存,而是在网络 I/O 模块带来 CPU 的耗时,所以 Redis6.0 的多线程是用来处理网络 I/O 这部分,充分利用 CPU 资源,减少网络 I/O 阻塞带来的性能损耗。