单线程的redis如何实现阻塞队列

Redis作为单线程模型的数据库,其阻塞队列BLPOP是如何工作的?其实,Redis通过I/O多路复用机制确保阻塞操作不影响其他命令的执行。当BLPOP命令遇到空list,它将client加入blockling_keys字典,并在有PUSH操作时唤醒客户端,从而实现实时响应。这个过程类似轮询,确保了单线程环境下阻塞命令的并行处理。
摘要由CSDN通过智能技术生成

从redis的API可以了解到lpop,rpop可以实现一个阻塞式队列。那疑问就来了,redis不是单线程的吗,如果阻塞了,那其他操作就执行不了呀。事实不是这样的

 

redis的线程模型,是接收客户端命令的线程时 I/O 多路复用的,再通过文件事件分配器单线程执行的。如下图,程序总是会将所有产生事件的套接字都入队到一个队列里面, 然后通过这个队列, 以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字: 当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕), I/O 多路复用程序才会继续向文件事件分派器传送下一个套接字

在这里插入图片描述

 

那实际上我们关心的BLPOP 命令的执行就是在文件事件分派器分派后是怎么执行的了。

对BLPOP命令的处理流程是这样的:

redis先找到对应的key的list,如果list不为空则pop一个数据返回给客户端;
如果list为空,或者list不存在,就将该key添加到一个blockling_keys的字典中,value就是想订阅该key的client

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值