socket 服务 同一个连接多线程访问_Redis多线程原理详解

本文详细探讨了Redis的单线程实现及其优势,包括文件事件和时间事件的处理。接着,介绍了Redis在接收请求参数、解析请求和响应客户端时采用的多线程模型,以及如何通过任务队列实现无锁操作,确保高并发场景下的性能。文章最后分析了Redis如何避免主线程和子线程同时访问队列,以达到高效的并发处理。
摘要由CSDN通过智能技术生成

8d209f043d2798e68d78aed4debb3d25.png

本篇文章为你解答以下问题:

  • 0:redis单线程的实现流程是怎样的?
  • 1:redis哪些地方用到了多线程,哪些地方是单线程?
  • 2:redis多线程是怎么实现的?
  • 3:redis多线程是怎么做到无锁的?

0:redis单线程的实现流程是怎样的?

Redis一开始是单线程模型,在一个线程中要同时处理两种事件:文件事件和时间事件

文件事件主要是网络I/O的读写,请求的接收和回复

时间事件就是单次/多次执行的定时器,如主从复制、定时删除过期数据、字典rehash等

redis所有核心功能都是跑在主线程中的,像aof文件落盘操作是在子线程中执行的,那么在高并发情况下它是怎么做到高性能的呢?

由于这两种事件在同一个线程中执行,就会出现互相影响的问题,如时间事件到了还在等待/执行文件事件,或者文件事件已经就绪却在执行时间事件,这就是单线程的缺点,所以在实现上要将这些影响降到最低。那么redis是怎么实现的呢?

定时执行的时间事件保存在一个链表中,由于链表中任务没有按照执行时间排序,所以每次需要扫描单链表,找到最近需要执行的任务,时间复杂度是O(N),redis敢这么实现就是因为这个链表很短,大部分定时任务都是在serverCron方法中被调用。从现在开始到最近需要执行的任务的开始时间,时长定位T,这段时间就是属于文件事件的处理时间,以epoll为例,执行epoll_wait最多等待的时长为T,如果有就绪任务epoll会返回所有就绪的网络任务,存在一个数组中,这时我们知道了所有就绪的socket和对应的事件(读、写、错误、挂断),然后就可以接收数据,解析,执行对应的命令函数。

如果最近要执行的定时任务时间已经过了,那么epoll就不会阻塞,直接返回已经就绪的网络事件,即不等待。

总之单线程,定时事件和网络事件还是会互相影响的,正在处理定时事件网络任务来了,正在处理网络事件定时任务的时间到了。所以redis必须保证每个任务的处理时间不能太长。

redis处理流程如下:

1:服务启动&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值