redis 在宏观上是多线程运行, 在微观上是单线程模型
什么是线程安全问题
在多线程中, 会出现多个线程同时对一个变量进行操作(如自增), 那么两次操作之后, 可能会出现结果不准确的情况(比如两次自增只让该变量的值+1, 而非+2)
redis 中不存在线程安全问题
redis 只使用一个线程, 来处理所有命令请求, 所以当多个请求同时到达 redis 服务器, 这些请求会在队列中排队, 再等待 redis 服务器 一个一个将队列里的请求取出执行, 因此, 微观上讲, redis 服务器是串行 / 顺序执行这多个命令的.
redis 能够使用单线程模型很好工作的原因
redis 的核心业务逻辑, 都是短平快的, 不太消耗 cpu 资源, 因此也就不太吃多核了
(老板向员工分派任务, 只要说你去整理一下报表, 具体表的结构, 内容, 整理方式 etc, 不需要老板再给你详细说了吧, 那只是分一下任务, 自然短 - 平 - 快 !)
redis 使用单线程模型效率仍然很高, 速度仍然很快的原因 (参照物是数据库 mysql, Oracle, sql server …)
- redis 访问内存. 数据库则是访问硬盘.
- redis 的核心功能, 比数据库的核心功能更简单
- 单线程模型, 避免了一些不必要的线程竞争开销
- 处理网络 IO 的时候, 使用了 epoll 这样的 IO多路复用机制
什么是 IO 多路复用机制
一个线程可以管理多个 socket
对 TCP 来说, 服务器每服务一个客户端, 就会分配一个 socket 给客户端
但是同一时间只有少数 socket 是活跃的
如果使用一个线程来管理一个 socket , 那么大多数时间都会是静默的
因此 我们可以使用一个线程来处理多个 socket, 这就是 IO 多路复用
Linux 上提供 IO 多路复用, 主要是三套 API
select 轮询, 挨个查看, 该事件会不会被调用
poll
epoll 事件通知 / 回调机制 (新出的, 效率高)