redis为什么快
数据存储在内存中
Redis完全基于内存存储数据,大部分请求是纯内存操作,速度极快。
避免了传统磁盘文件数据存储的磁盘I/O开销。高效的数据结构
Redis有5种数据类型:String、List、Hash、Set、SortedSet。
不同数据类型使用一个或多个底层数据结构支持,以实现更快的速度。单线程架构
单线程节省了上下文切换和CPU消耗的时间。
没有竞态条件,无需考虑各种锁问题,避免了死锁导致的性能开销。
允许使用各种“线程不安全”的命令,如Lpush。
虽然是单线程,但Redis的其他功能(如持久化、异步删除、集群数据同步)由额外的线程执行。
单线程易于实现,且CPU不会成为瓶颈,因此采用单线程方案。
- 非阻塞I/O
基于网络I/O多路复用(非阻塞I/O)的线程模型,可以处理并发连接,缓解网络I/O速度慢的问题。
多路复用I/O模型利用select、poll、epoll等同时监控多个流的I/O事件。
当有I/O事件时,线程被唤醒并处理就绪的流,避免了大量无用操作。
Redis的网络事件处理器基于Reactor模式,即文件事件处理器。
文件事件处理器使用I/O多路复用同时监听多个socket,并将socket执行的任务与不同的事件处理器关联。
虽然文件事件处理器是单线程的,但通过I/O多路复用监听多个socket,实现了高性能的网络通信模型。
redis的多线程
Redis 6.0的多线程
在Redis 6.0之前,未使用多线程以保持高可维护性。
Redis 6.0引入多线程是因为网络I/O模块成为CPU时间的瓶颈。
多线程用于处理网络I/O,充分利用CPU资源,减少网络I/O阻塞导致的性能损失。
多线程模式下,接收、发送和解析命令可以配置为多线程执行,但命令执行(涉及内存操作)仍为单线程。
因此,Redis的多线程部分仅用于处理网络数据读写和协议解析,命令执行仍按顺序执行,无并发安全问题。如何启用多线程(Redis 6.0)
默认情况下,多线程是禁用的,可以在conf文件中启用:
1 | io-threads-do-reads yes |
官方建议:4核机器设置2-3个线程,8核机器设置6个线程。线程数应小于机器核心数,尽量不超过8个线程。
通过以上分析,我们可以看到Redis单线程架构的高性能主要源于其内存存储、高效数据结构、单线程的简单性和非阻塞I/O的使用。而Redis 6.0引入的多线程则进一步优化了网络I/O处理,提升了整体性能。