今天为大家带来的内容是:详细讲解:golang实现redis的延时消息队列功能展示(小白必看)
在学习过程中发现redis的zset还可以用来实现轻量级的延时消息队列功能,虽然可靠性还有待提高,但是对于一些对数据可靠性要求不那么高的功能要求完全可以实现。本次主要采用了redis中zset中的zadd, zrangebyscore 和 zdel来实现一个小demo。
提前准备 安装redis, redis-go
因为用的是macOS, 直接
![8f36db54968e8fc6171d185ad3dfeca9.png](https://i-blog.csdnimg.cn/blog_migrate/21e8f832b688d7f11d0c1c5cb188d075.jpeg)
又因为比较懒,生成任务的唯一id时,直接采用了bson中的objectId,所以:
![22044e7d0bec1767b570082382bbe550.png](https://i-blog.csdnimg.cn/blog_migrate/99cb31740867fad414a2765a67662a56.jpeg)
唯一id不是必须有,但如果之后有实际应用需要携带,便于查找相应任务。
生产者
通过一个for循环生成10w个任务, 每一个任务有不同的时间
![9c92dffb11de4e527e5ec070da38d76c.png](https://i-blog.csdnimg.cn/blog_migrate/b3142eecb05d8381785d3d1b3f2f84c2.jpeg)
嗨喽:正在学习python的小伙伴或者打算学习的,可以私信小编“07”领取资料!
其中AddJob函数在另一个包中, 将上一个函数中随机生成的时间作为需要处理的时间戳。
![94afcba846fd917cf9f6780a3d8a78ec.png](https://i-blog.csdnimg.cn/blog_migrate/c102c68fa832f3e56bde7411a231d219.jpeg)
消费者
消费者处理流程分为两个步骤:
- 获取小于等于当前时间戳的任务
- 通过删除当前任务来判断谁获得了当前任务
因为在获取小于等于当前时间戳的任务时,可能有多个go routine同时读到了当前任务,而只有一个任务可以来处理当前任务。因此我们需要通过一个方案来判断究竟由谁来处理这个任务(当然如果只有一个消费者可以读到就直接处理):这个时候可以通过redis的删除操作来获取,因为删除指定value时只有成功的操作才会返回不为0,所以我们可以认为删除当前队列成功的那个go routine拿到了当前的任务。
下面是代码:
![7a2617c611832ee520ce5b11e5331d6d.png](https://i-blog.csdnimg.cn/blog_migrate/c7163aac772cf8526f3cda245a0a4f13.jpeg)
![63a757d0e9549e3cdcfd7d66f351c423.png](https://i-blog.csdnimg.cn/blog_migrate/380cbb33d78cee6d59e03dab6939946c.jpeg)
redis部分的代码,获取任务和删除任务
![1032e9c0e04db51a7567020d8e82805b.png](https://i-blog.csdnimg.cn/blog_migrate/95c556302c29a3c2de2889794451feef.jpeg)
代码大抵如此。最后跑起来之后,大概每3-4秒钟能够处理掉1w个任务,速度上确实是...
以上就是本文的全部内容,希望对大家的学习有所帮助。
最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“07”即可领取。