Redis线程模型
Redis线程是单线程还是多线程
Redis核心处理一直都是单线程,但是其他处理模块也会有一些多线程、多进程的功能
- 网络I/O解包从6.0开始是多线程
- 某些异步流程从4.0开始用的是多进程,比如UNLIKE、FLUSHALL ASYNC等非阻塞的删除操作
Redis为什么用单线程做核心处理
- 首先如果引用多线程,主要是希望利用多核的性能,但是Redis是内存k-v存储,一般不会很慢。真正影响Redis性能的是网络I/O
- 其次多线程的上下文切换、同步机制开销等成本,会影响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是单线程。其次是多线程不是必要的,大部分情况下够用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 cloud_fly blog!