Redis 为什么采用单线程,为什么性能好
Redis 采用单线程的原因是因为在 内存中 进行读写操作,CPU不是Redis的性能瓶颈,而是内存和带宽,所以采用单线程可以避免 线程切换和锁的开销。
Redis 是什么?
Redis 是一个开源的内存数据库,它可以存储键值对,支持多种数据结构,如字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)等。
Redis 是不是单线程?
实际上,Redis 是多线程的,其内部有以下几个线程:
-
redis-server
:主线程,负责接收客户端的连接,读取请求,发送响应。 -
bio-close-file
:负责异步关闭大文件。 -
bio-aof-fsync
:负责将 AOF 文件异步刷到磁盘。 -
bio-lasy-free
:负责异步释放大内存。 -
jemalloc-bg-thread
:负责内存碎片整理。 -
io-thread
:IO 线程,负责 read/write,decode/encode。
Note
AOF(Append Only File) 是 Redis 的一种持久化方式,将所有写操作追加到文件末尾,重启时重新执行 AOF 文件中的命令即可恢复数据。实时硬盘操作,不会丢失数据,但是会影响性能。
除了 AOF,Redis 还有一种持久化方式是 RDB(Redis DataBase) ,它是将内存中的数据快照保存到磁盘上。非实时硬盘操作,可能会丢失数据,但是性能更好。
Redis 为什么采用单线程?
-
Redis 不是 CPU 密集型应用,CPU 不是 Redis 的性能瓶颈。
-
如果采用多线程,会导致加锁解锁的开销大,CPU 上下文切换开销大。数据库请求量变化大,一会有请求,一会无请求,多线程会在运行和阻塞状态来回切换。
单线程的 Redis 为什么速度很快?
Redis 机制
-
内存数据库:Redis 是一个内存数据库,内存的读写速度相比于磁盘的读写速度要快很多。
-
数据结构高效:Redis 使用了很多高效的数据结构,如哈希表、跳表等。
-
使用了 Reactor 模型:Redis 使用了 Reactor 模型,采用了 IO 多路复用技术,可以处理多个客户端请求。采用的是非阻塞 IO,不会因为一个 IO 阻塞导致其他任务无法执行。
Redis 采用的优化
-
耗时的操作,另起线程:如 AOF 文件的刷盘操作,Redis 会另起线程异步执行。
-
拆分大任务:例如 Dict 的扩容(rehash)操作,Redis 会将其拆分为多个小任务,分批执行。
-
不同的对象类型选择不同的数据结构:根据节点数量,Redis 会选择不同的数据结构,以取得空间和时间上的平衡。