for循环延时_详细讲解:golang实现redis的延时消息队列功能展示(小白必看)

862f45816403a4a78585fe6552af7e8b.png

今天为大家带来的内容是:详细讲解:golang实现redis的延时消息队列功能展示(小白必看)

在学习过程中发现redis的zset还可以用来实现轻量级的延时消息队列功能,虽然可靠性还有待提高,但是对于一些对数据可靠性要求不那么高的功能要求完全可以实现。本次主要采用了redis中zset中的zadd, zrangebyscore 和 zdel来实现一个小demo。

提前准备 安装redis, redis-go
因为用的是macOS, 直接

7c2699c642bb45b4ccfeeb9469b0b4d4.png

又因为比较懒,生成任务的唯一id时,直接采用了bson中的objectId,所以:

f8a86383caeab9c484dd7de25d334dde.png

唯一id不是必须有,但如果之后有实际应用需要携带,便于查找相应任务。

生产者

通过一个for循环生成10w个任务, 每一个任务有不同的时间

e35224b891f85b679551d936a38d09df.png

其中AddJob函数在另一个包中, 将上一个函数中随机生成的时间作为需要处理的时间戳。

e3cddb38a8392aa85194e62ca0cbf673.png

消费者

消费者处理流程分为两个步骤:

  1. 获取小于等于当前时间戳的任务
  2. 通过删除当前任务来判断谁获得了当前任务

因为在获取小于等于当前时间戳的任务时,可能有多个go routine同时读到了当前任务,而只有一个任务可以来处理当前任务。因此我们需要通过一个方案来判断究竟由谁来处理这个任务(当然如果只有一个消费者可以读到就直接处理):这个时候可以通过redis的删除操作来获取,因为删除指定value时只有成功的操作才会返回不为0,所以我们可以认为删除当前队列成功的那个go routine拿到了当前的任务。

下面是代码:

bb9d3b99d7bb10a8d68d4319f15c4bc4.png

4c91d9409ca87aa1466e9217d5e66c70.png

redis部分的代码,获取任务和删除任务

21aac5fa319fd77f555550779eef884a.png

代码大抵如此。最后跑起来之后,大概每3-4秒钟能够处理掉1w个任务,速度上确实是...

以上就是本文的全部内容,希望对大家的学习有所帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值