大家好,我是骄阳。
我们面试中经常遇到这样一个问题:redis是单线程的吗?
redis6之前
1. Redis6.0之前真的是单线程吗?
Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都是由主线程处理,按照顺序串行处理,这就是所谓的“单线程”,这也是 Redis 对外提供键值存储服务的主要流程。
但如果严格来讲从Redis4.0之后到redis6之前,都不是真正意义上的单线程。
因为除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如持久化,集群数据同步,清理脏数据、无用连接的释放、大 key 的删除等等。
2. Redis6.0之前为什么不使用多线程?
(1)使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。
Redis通过使用pipelining每秒可以处理100万个请求,所以如果应用程序主要使用一些基础的命令(比如key的读取和写入),它几乎不会占用太多CPU。
(2)使用了单线程后,可维护性高。
单线程机制使得 Redis 内部实现的复杂度大大降低,Hash 的Rehash 等线程不安全”的命令都可以无锁进行,且线程安全。
多线程模型虽然在某些方面表现优异,但可能带来线程安全问题,增加了系统复杂度、同时可能存在线程切换、加锁解锁、死锁等造成的性能损耗。
(3)Redis通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。
好啦,今天的内容就到这里啦,喜欢我的可以点下关注支持一下~