【JavaP6大纲】Redis篇:redis单线程模型
你是如何理解redis单线程模型的?
Redis 里面的单线程主要是 Redis 的网络 IO 和键值对读写,它是由一个线程来完成的,但是 Redis 的其他功能,比如说持久化、异步删除、集群数据同步等等,这些其实是由额外的线程执行的,这里的单线程主要是Redis 对外提供键值存储服务来说的。
主要流程是这样的:
- redis 会将每个客户端都关联一个指令队列,客户端的指令通过队列来按顺序处理,先到先处理,一个客户端指令队列中的指令是按顺序执行的。
- redis 的每个客户端都关联一个响应队列,通过响应队列有顺序地将指令的返回结果返回给客户端。
- redis同一时间每次都只能处理一个客户端队列中的指令或者响应。
Redis 如何处理高并发客户端连接?
redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
为什么redis使用单线程模型还能保证高性能?
- 第一个是因为redis 是纯内存操作,内存的响应时长是 100 纳秒左右,这是 redis 的 QPS 过万的重要基础。
- 第二个是因为redis 的核心是基于非阻塞的IO多路复用机制,单线程模型避免了线程切换和竞态产生的消耗,解决了多线程的切换性能损耗问题。
- 第三个是因为redis 底层使用C语言实现,一般来说,C 语言实现的程序"距离"操作系统更近,执行速度相对会更快。
什么是阻塞IO?
当我们调用