《Redis深度历险》学习笔记:线程模型&持久化
线程模型
非阻塞IO
- Redis、Node.js、Nginx 均是单线程服务,但他们都是服务器高性能的典范。
- Redis 4.0 版本抛弃了单线程设计,转为多线程设计,但其主处理程序依然是单线程模型。
- Redis 使用单线程进行设计的原因:
- 更好的可维护性,方便开发和调试:多线程模型存在竞争条件 (race condition)问题,多个进行的执行顺序会对共享内存的内容造成影响,需要额外设计锁逻辑。
- 处理并发请求:将数据库的开、关、读、写都转换成了事件,使用
I/O 多路复用
机制轮询描述符处理并发连接,同时等待多个连接发送的请求。 - Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU:一个 Redis 服务在 1s 内可处理 100w 个用户请求,如无法满足,应使用分片将不同的请求交给不同的 Redis 服务器来处理,而不是在同一个 Redis 服务中引入大量的多线程操作。
- 每一个网络连接都会产生一个
文件描述符
,并由执行事件循环(死循环)的多路复用
模块接收,然后关联指令队列,交给文件事件分配器
按顺序处理。一旦期间有任何事件到来,就可以立即返回。时间过了之后还是没有任何事件到来,也会立即返回。(Source: Redis 和 I/O 多路复用)