本文以收录专栏 redis核心技术
前言
本专栏为了帮助大家更好的了解学习redis,同时也是自己记录学习redis的内容,包含了大部分的redis核心技术,分布式锁,主从复制等
目录
专题2-单线程redis为什么这么快
2.1redis只有单线程吗?
2.2为什么redis使用单线程
2.3为什么redis单线程这么快?
2.4基于多路复用的高性能I/O模型
专题2-单线程redis为什么这么快
2.1redis只有单线程吗?
为什么说redis是单线程?
redis的网络IO和键值对读写是由一个线程来完成的,这也是redis对外提供键值存储服务的主要流程。
2.2为什么redis使用单线程
多线程面临 多线程编程模式面临共享资源的并发访问控制问题。
多线程有一个关键的瓶颈,系统通常会存在被多线程同时访问的共享资源,比如一个共享的数据结构,当多个线程要修改这个共享资源的时候,为了保证共享资源的正确性,就需要额外的机制进行保证,这个额外的机制,就会带来额外的开销。
所以多线程会降低系统代码易调试性和可维护性。所以为了避免出现这种为问题,redis直接使用单线程模式。
2.3为什么redis单线程这么快?
两个方面原因:
- redis大部分操作在内存上完成,并且它有高效的数据结构。
- redis采用了多路复用机制,使其在网络IO操作中能处理大量的客户端请求,实现高吞吐率。
但是如果线程被阻塞,就无法进行多路复用了。
为什么线程会被阻塞?这需要了解基本IO模型与阻塞点
这里潜在的阻塞点:accept()和recv()
当 Redis监听到一个客户端有连接请求,但一直未能成功建立起连接时,会阻塞在 accept() 函数这
里,导致其他客户端无法和 Redis 建立连接。
类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv()。
这样会导致线程阻塞,无法处理其他客户端请求,导致效率降低。
非阻塞模式
在 socket 模型中,不同操作调用后会返回不同的套接字类型。socket() 方法会返回主动套
接字,然后调用 listen() 方法,将主动套接字转化为监听套接字,此时,可以监听来自客户
端的连接请求。最后,调用 accept() 方法接收到达的客户端连接,并返回已连接套接字。
2.4基于多路复用的高性能I/O模型
Linux中的IO多路复用机制。该机制允许内核中,同时存在多个监听套接字。内核会一直监听这些套接字上的连接请求或数据请求。
redis可以同时和多个客户端连接并处理请求,从而提高并发性。
总结:多路复用的IO模型密切相关,因为避免了accept()和send()/recv()潜在的网络IO操作阻塞点。