一、为什么Redis是单线程的?
Redis 是基于内存的操作,而CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存的
大小或者网络带宽。同时,单线程的实现更加简单和经济,采用单线程可以使指令串行,不用额外
维护锁机制,避免了不必要的上下文切换和竞争条件,减少了CPU的消耗。Redis在处理客户端的
读写请求时,只有一个主线程,而在处理以下这些操作时,Redis会fork出其他的子线程来处理:
-
主从数据同步
-
切片集群数据同步
-
过期键值异步删除
-
AOF或RDB持久化
总结得到四点结论:
-
内存操作
-
高效的底层数据结构
-
多路复用IO模型
-
避免多线程切换开销
二、Redis有多快?
Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提
供的数据是可以达到10W+的QPS(每秒内查询次数)。
三、Redis为什么可以达到这么快?
1.Redis完全基于内存,大部分操作都是在内存中完成的;
2.采用单线程:避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切
换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导
致的性能消耗;
3.使用多路I/O复用模型,非阻塞IO:Redis可以在单线程中监听多个Socket的请求,在任意一
个Socket可读/可写时,Redis去读取客户端请求,在内存中操作对应的数据,然后再写回到Socket
中。;
4.非CPU密集型任务:Redis的瓶颈受限于内存和网络宽带,在高并发的请求下,Redis需要
更多的内存空间和更快的网络,否则这会导致瓶颈很容易出现在内存不够用和网络延迟等待的情
况,当Redis实例不满足使用时,可以通过部署多个Redis节点。或者搭建CPU集群的方式利用多
核的CPU。
四、单线程Redis的缺点?
1.内存空间受限,只能用于小数据量的高性能操作;
2.用于缓存时,易出现'缓存雪崩','缓存击穿'等问题;
3.无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善。
五、Redis为什么不采用多进程或是多线程进行处理?
1.多线程处理可能涉及到锁。
2.多线程处理会涉及到线程切换而消耗 CPU。