20201112-Redis单/多线程模式
Redis单线程理解
Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。
但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
Redis 单线程是指它对网络 IO 和数据读写的操作采用了一个线程,而采用单线程的一个核心原因是避免多线程开发的并发控制问题。单线程的 Redis 也能获得 高性能,跟多路复用的 IO 模型密切相关,因为这避免了accept() 和 send()/recv() 潜在的网络IO操作阻塞点。
Redis快的原因
1、Redis 的大部分操作在内存上完成,再加上它采用了高效的数据结构,例如哈希 表和跳表,这是它实现高性能的一个重要原因。
2、Redis 采用了多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。
Redis的网络IO多路复用机制
基于多路复用的Redis高性能IO模型.png上图就是基于多路复用的Redis IO模型。 Redis 网络框架调用 epoll 机制,让内核监听这些套接字。此时Redis 线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理 上。正因为此Redis 可以同时和多个客户端连接并处理请求,从而提升并发性。
为了在请求到达时能通知到 Redis 线程,select/epoll 提供了基于事件的回调机制,即针 对不同事件的发生,调用相应的处理函数。
这些事件会被放进一个事件队列,Redis 单线程对该事件队列不断进行处理。这样一来, Redis 无需一直轮询是否有请求实际发生,这就可以避免造成 CPU 资源浪费。同时, Redis 在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件 的回调。因为 Redis 一直在对事件队列进行处理,所以能及时响应客户端请求,提升 Redis 的响应性能。
IO多路复用机制
Redis单/多线程对比
2020 年 5 月,Redis 6.0 的稳定版发布了。
多线程模型和IO模型有什么关联?
会引入复杂的并发控制问题吗?
会给 Redis 6.0 带来多大提升?