
我们常常会听说Redis是单线程机制,Redis6.0引入了多线程机制,那么Redis的单线程指的是什么呢?既然单线程已经够快了,那么为什么6.0版本又要开始引入多线程呢?本文将从以下几个方面回答Redis中线程方面的一些问题。
Redis作为一款高性能的内存性数据库,在内存优化、持久化、集群、数据复制和同步方面都有自己的一套优秀的设(面)计(试)方(考)案(点)。显然这么多事情同时放在一个线程内做是不合理的,因此Redis的单线程事实上指的是处理网络I/O请求和键值对操作放在一个线程内完成,其他诸如持久化、数据复制等操作都是放在其他线程内完成。
Redis官方认为相比CPU,Redis的性能更多的是受到内存和网络I/O的限制。如果需要提高cpu的使用率,可以通过启动多个实例的方式。

Redis 设计了一套在时间和空间上更加高效的数据结构,根据实际数据量的不同数据类型底层会选择更加适合的数据结构,因此Redis的命令操作会非常高效。
| 数据类型 | 底层数据结构 |
|---|---|
| String | 简单动态字符串 |
| List | 双向列表、压缩列表 |
| Set | 整数数组、哈希表 |
| Hash | 压缩列表、哈希表 |
| Sorted Set | 压缩列表、跳表 |
Redis 单线程实际上是基于Linux的多路复用机制,基于事件回调,即Redis将事件监听交给linux内核去做,当FD上有新的事件到达时,内核会将事件放进事件队列,不同的事件会绑定不同的回调处理函数,这样Redis只需要处理事件队列中的事件,而不需要去阻塞轮询是否有请求到达。
1、同一时刻只能有一个cpu核被用到
2、当执行一些耗时操作,例如删除一个非常大的键值,服务器可能会被阻塞几秒。
根据Redis官方FAQ :

即单个哈希表/列表/集合/有序集合最多可以容纳2的32次方个元素,也就是说,单个键值可以非常
大,那么当需要删除非常大的主键时,就可能会发生阻塞。
3、基于当前Redis单线程模型,很难再进一步去提高Redis的QPS。
4、随着硬件性能提升,网络I/O可能会成为Redis的瓶颈,即主线程处理请求的速度跟不上网络硬件速度。
主线程接收到客户端请求后,将请求放入队列中,分配给I/O线程,I/O线程仅解析socket内的请求,I/O线程解析完之后通知主线程,由主线程执行请求的命令,执行完之后把结果写完缓存,由I/O线程将结果回写到socket返回给客户端。

即I/O线程仅做解析网络请求的操作,实际执行请求还是由主线程完成,这样一方面提高了处理网络请求的效率,另一方面实际执行事务过程还是由主线程完成,也避免了多线程引起的额外开销。
喜欢的话就点个赞吧~