Redis单线程的理解

1. 写在前面

最近在做缓存改造批量删除旧缓存时有个疑问,考虑到Redis是单线程处理缓存的情况,那么在执行批量删除时会不会影响其他线上缓存的正常处理呢?网上找了相关资料发现没有描述的清楚的,而是集中在Redis为什么这么快的原因上,再次读了《Redis设计与实现》第12章,顺便做一下简单描述。

2. Redis事件及I/O多路复用

Redis服务器是一个事件驱动服务程序,且服务器主要处理以下两类事件:

  • 文件事件: Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。Redis服务器与客户端通信会产生相应的文件事件。

    文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的的文件事件就会产生,这时文件事件 处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

  • 时间事件: 时间事件包括定点事件(指定时间点执行某个事件)和周期事件(周期性地执行某个事件)。

3. Redis是单线程原因分析

了解了事件,再说一下文件事件处理器的组成,文件事件处理器有四个组成部分,分别是套接字、I/O多路复用程序、文件事件分派器(dispatcher)以及事件处理器。如下图所示:
在这里插入图片描述

  • 套接字: 文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,都会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能并发的出现。
  • I/O多路复用程序: I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送那些产生了事件的套接字。尽管多个文件事件可能会并发出现,但I/O多路复用程序总是会将所有产生事件的套接字都放到一个队列里面,然后通过这个队列,以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分配器传送套接字。当上一个套接字产生的事件处理完毕之后(该套接字为事件所关联的事件处理器执行完毕),I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。
  • 文件事件分派器: 文件事件分派器接受 I/O多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器。服务器会为执行不同任务的套接字关联不同的事件处理器。
  • 事件处理器: 处理器是一个个函数,它们定义了某个事件发生时,服务器应该执行的动作。

了解了上面4个组成部分,便能理解了为什么说Redis是单线程的原因,虽然文件事件处理器以单线程的方式运行,但通过I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他同样的以单线程方式运行的模块进行连接,这保持了Redis内部单线程设计的简单性。至于为Redis为什么那么快,网上提供了很多原因,不再详细说明。

再回到开头的那个问题,批量删除会不会影响其他线上缓存的业务?需要弄明白两个问题

问题一:Redis事件处理器进行事件处理的时候是多线程还是单线程?若是单线程,还是原来那个执行事件分派的那个线程吗?

Redis事件处理器进行事件处理的时候是单线程的,还是原来执行整个分派的那个线程。

问题二:同一时间内事件处理器会不会接收到两个或者多个事件事件?如果接收到了怎么处理?

同一时间内事件处理器不会接收到两个或者多个事件的,因为只一上一个套接字产生的事件处理完毕之后,I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。Redis对文件事件和时间事件的处理都是同步、有序、原子地执行的,服务器不会中途中断事件处理,也不会对事件进行枪占,因此,不管是文件事件的处理器,还是时间事件的处理器,他们都会尽可能减少程序的阻塞时间,并在有需要时主动让出执行权,从而降低事件饥饿的可能性。

综上,如果存在大量耗时删除key的话,可能会影响其他业务key的业务处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值