2026/4/18 5:57:24
网站建设
项目流程
有关做详情页的参考网站,如何做团购网站中的美食地处地图功能,深圳门户网站,大学生旅游网站策划书一、Redis有多快#xff1f;
Redis是基于内存运行的高性能 K-V 数据库#xff0c;官方提供的测试报告是单机可以支持约10w/s的QPS二、Redis为什么这么快#xff1f;
#xff08;1#xff09;完全基于内存#xff0c;数据存在内存中#xff0c;绝大部分请求是纯粹的内存操…一、Redis有多快Redis是基于内存运行的高性能 K-V 数据库官方提供的测试报告是单机可以支持约10w/s的QPS二、Redis为什么这么快1完全基于内存数据存在内存中绝大部分请求是纯粹的内存操作非常快速跟传统的磁盘文件数据存储相比避免了通过磁盘IO读取到内存这部分的开销。2数据结构简单对数据操作也简单。Redis中的数据结构是专门进行设计的每种数据结构都有一种或多种数据结构来支持。Redis正是依赖这些灵活的数据结构来提升读取和写入的性能。3采用单线程省去了很多上下文切换的时间以及CPU消耗不存在竞争条件不用去考虑各种锁的问题不存在加锁释放锁操作也不会出现死锁而导致的性能消耗。4使用基于IO多路复用机制的线程模型可以处理并发的链接。Redis 基于 Reactor 模式开发了自己的网络事件处理器这个处理器被称为文件事件处理器 file event handler。由于这个文件事件处理器是单线程的所以Redis才叫做单线程的模型但是它采用IO多路复用机制同时监听多个Socket并根据Socket上的事件来选择对应的事件处理器进行处理。文件事件处理器的结构包含4个部分线程模型如下图多个SocketIO多路复用程序文件事件分派器事件处理器命令请求处理器、命令回复处理器、连接应答处理器多个 Socket 可能会产生不同的操作每个操作对应不同的文件事件但是IO多路复用程序会监听多个Socket将Socket产生的事件放入队列中排队事件分派器每次从队列中取出一个事件把该事件交给对应的事件处理器进行处理。Redis客户端对服务端的每次调用都经历了发送命令执行命令返回结果三个过程。其中执行命令阶段由于Redis是单线程来处理命令的所有每一条到达服务端的命令不会立刻执行所有的命令都会进入一个队列中然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行不会产生并发问题这就是Redis的单线程基本模型。多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力在空闲的时候会把当前线程阻塞掉当有一个或多个流有 I/O 事件时就从阻塞态中唤醒然后程序就会轮询一遍所有的流epoll 是只轮询那些真正发出了事件的流并且依次顺序的处理就绪的流这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个客户端的网络IO连接请求尽量减少网络 IO 的时间消耗5Redis直接自己构建了VM 机制 避免调用系统函数的时候浪费时间去移动和请求三、为什么Redis是单线程这里我们强调的单线程指的是网络请求模块使用一个线程来处理即一个线程处理所有网络请求其他模块仍用了多个线程。那为什么使用单线程呢官方答案是因为CPU不是Redis的瓶颈Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现而且CPU不会成为瓶颈那就顺理成章地采用单线程的方案了。但是我们使用单线程的方式是无法发挥多核CPU 性能不过我们可以通过在单机开多个Redis 实例来解决这个问题四、Redis6.0 的多线程1、Redis6.0 之前为什么一直不使用多线程Redis使用单线程的可维护性高。多线程模型虽然在某些方面表现优异但是它却引入了程序执行顺序的不确定性带来了并发读写的一系列问题增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。2、Redis6.0 为什么要引入多线程呢因为Redis的瓶颈不在内存而是在网络I/O模块带来CPU的耗时所以Redis6.0的多线程是用来处理网络I/O这部分充分利用CPU资源减少网络I/O阻塞带来的性能损耗。3、Redis6.0 如何开启多线程默认情况下Redis是关闭多线程的可以在conf文件进行配置开启io-threads-do-reads yesio-threads 线程数## 官方建议的线程数设置4核的机器建议设置为2或3个线程8核的建议设置为6个线程线程数一定要小于机器核数尽量不超过8个。4、多线程模式下是否存在线程并发安全问题如图一次redis请求要建立连接然后获取操作的命令然后执行命令最后将响应的结果写到socket上。在redis的多线程模式下获取、解析命令以及输出结果着两个过程可以配置成多线程执行的因为它毕竟是我们定位到的主要耗时点但是命令的执行也就是内存操作依然是单线程运行的。所以Redis 的多线程部分只是用来处理网络数据的读写和协议解析执行命令仍然是单线程顺序执行也就不存在并发安全问题。