简介
本文介绍为什么Redis速度很快,性能很高。
本技术也是Java后端面试中经常问到的问题。
Redis为什么速度很快
- 数据存放在内存中
- 内存的读写速度是磁盘(数据库)的一百倍左右。
- 用C语言实现
- C语言更底层, 执行速度相对会更快。
- 使用了多路复用
- Redis是单线程的,但内部使用了IO多路复用提高性能。
- 作者对代码的精打细磨
- 曾经有人评价Redis是少有的集性能和优雅于一身的开源代码。
Redis单线程的优缺点
单进程单线程优势
- 没有多线程竞争锁的性能消耗。
- 没有多线程导致的切换而消耗CPU。
单进程单线程弊端
无法发挥多核CPU性能。不过可以通过在单机开多个Redis实例来完善;
//CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽
为什么单线程还这么快?
概述
Redis是单线程的,它的网络IO和命令的执行(键值对读写)是由一个线程来完成的。但Redis的其他操作提高了性能:
- Redis的其他功能是由其他线程来执行的,比如持久化、异步删除、集群数据同步等。
- I/O多路复用(非阻塞I/O)
- Redis采用epoll做为I/O多路复用技术的实现,Redis将epoll进行了封装,它自身的事件处理模型将epoll中的连接、读写、关闭都转换为了事件,不在I/O上浪费过多的时间。
IO多路复用
简介
Redis 采用网络IO多路复用技术来保证多连接时的高吞吐量。
多路:指的是多个网络连接,复用:指的是复用一个线程。采用多路I/O复用技术可以让单个线程处理多个连接请求(文件句柄)。一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出CPU。
多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术,Redis使用的epoll(Netty也是用的这个)。
Redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
- 多个 socket
- IO 多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
处理流程
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
来看客户端与 redis 的一次通信过程
Redis6的多线程
在 Redis 中,单线程的性能瓶颈主要在网络IO操作上。如果要对一些大的键值对进行删除操作的话,短时间内是删不完的,对于单线程来说就会阻塞后边的操作。
Redis6.0的多线程:将网络数据读写和协议解析用多线程的方式来处理,对于命令执行来说,仍然使用单线程操作。也就是说,Redis6.0的多线程是为了解决其网络IO的瓶颈。
请先
!