Redis线程是单线程还是多线程

Redis核心处理一直都是单线程,但是其他处理模块也会有一些多线程、多进程的功能

  • 网络I/O解包从6.0开始是多线程
  • 某些异步流程从4.0开始用的是多进程,比如UNLIKE、FLUSHALL ASYNC等非阻塞的删除操作

Redis为什么用单线程做核心处理

  1. 首先如果引用多线程,主要是希望利用多核的性能,但是Redis是内存k-v存储,一般不会很慢。真正影响Redis性能的是网络I/O
  2. 其次多线程的上下文切换、同步机制开销等成本,会影响Redis的性能

Redis单线程性能如何

性能很好,普通机器1s10多万的读性能,几万的写性能

redis-benchmark测试命令:

1
redis-benchmark -h 127.0.0.1 -p 6379 -t set,get -n 10000 -q

为什么Redis单线程性能还这么快

  • 基于内存操作:Redis是内存k-v存储
  • 高效的数据结构:依赖String、List、Hash等高效的数据结构
  • 采用单线程:没有多线程上下文切换、锁竞争等问题
  • I/O多路复用:Redis的瓶颈在I/O而不是CPU,多路复用同时监听多个socket,根据socket上的事件来选择对应的处理器进行处理

Redis6.0引入多线程是什么

  • Redis的瓶颈在I/O而不是CPU,但随着互联网的发展,请求量巨大的时候单线程在同步读写I/O的时间(读写客户端socket的I/O),单核CPU也可能处理不过来。 因此针对核心处理流程中的解包、发包这两个CPU耗时操作,进行了多线程优化
  • Redis6.0多线程是默认关闭的,如果需要开启可以在redis.conf中修改。这么做的目的是首先为了兼容以前的,因为很多人认为Redis是单线程。其次是多线程不是必要的,大部分情况下够用