使用Redis做消息队列

基于内存的单线程数据库,使Redis的线程安全性极高。而Redis的双向链表数据类型(List)天生就可作为消息队列存储消息.
在这里就不说消息队列的等等一些优点。但是补充一下Redis的List类型的几个命令,你可以指定将一个元素投送到列表的头部(左边)或者尾部(右边),当然也可以指定从列表的头部或尾部取出数据.
LPush:添加元素至列表的头部


RPush:添加元素至列表的尾部


LPop:移除并获取列表的头部的第一个元素


RPop:移除并获取列表的尾部的第一个元素


BLpop:移出并获取列表头部的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。命令格式:blpop key timeout,当timeout=0时,表示一直阻塞等待,直到有其他客户端执行rpush或者lpush命令,插入数据后,阻塞才解除.
BRpop:与BLpop相同,不同的是它是移除列表尾部的第一个元素.
如下,开启两个客户端,一个客户端先使用BLpop阻塞读取数据,另一个客户端写入数据.

OK,到此我想你已经明白了,List的作用已经显而易见。生产者投入消息,消费者拿到消息。而且双向链表的数据类型,投入和拿取数据都特别灵活。是不是感觉很不错?接着往下看
下面在代码中实现消息队列的数据投递与拾取.
引入NuGet包:StackExchange.Redis
生产者:
static void Main(string[] args)
{
var redis = new RedisContent();
for (int i = 0; i < 10; i++)
{
redis.db.ListRightPush("datalist", $"data{i}");//向列表的尾部投递消息
Console.WriteLine($"{DateTime.Now} 已投递消息data{i}!");
Thread.Sleep(3000);
}
Console.ReadKey();
}
消费者:
static void Main(string[] args)
{
var redis = new RedisContent();
while (true)
{
string result = redis.db.ListRightPop("datalist");//从列表的尾部拾取消息 if (string.IsNullOrEmpty(result)) { }
else
{
Console.WriteLine($"{DateTime.Now} 已接收消息,Message={result.ToString()}");
Thread.Sleep(1000);
}
}
}
为了让大家看到效果,我故意让线程等待了几秒钟.
先进先出和先进后出的实现方式都比较灵活,如果要想实现先进先出的规则的话,要将上面的消费者代码改为redis.db.ListLeftPop("datalist")=>从头部开始读取消息
但是上面的代码有一个很大的弊端,虽然消息已经消费完了,但是仍然在不停的lpop,所以造成很大的浪费.就算是这里使用了Sleep,一定程度上减少了CPU的占用率,但是消息处理的时效性就削弱了.
不用担心,对此肯定有解决的方法
使用Redis做消息队列的更多相关文章
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
- 程序员过关斩将--redis做消息队列,香吗?
Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...
- Redis 做消息队列
一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...
- Redis做消息队列
1.连接从Redis中获取日志文件并存储到ES中 [root@Logstash ~]# vim /usr/local/logstash/config/redis.conf input { be ...
- RabbitMQ跟Redis做消息队列的区别
区别 https://www.zhihu.com/question/20795043 https://blog.csdn.net/dd18709200301/article/details/79077 ...
- Redis做消息队列文章两篇
介绍:http://www.cnblogs.com/lhfcws/p/3732535.html 具体做法:http://shift-alt-ctrl.iteye.com/blog/1867454 另外 ...
- 使用Redis Stream来做消息队列和在Asp.Net Core中的实现
写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消息队列,而不想引入新的服务,kafk ...
- PHP使用Redis实现消息队列
消息队列可以使用MySQL来实现,可以参考博客PHP使用MySQL实现消息队列,虽然用MySQL可以实现,但是一般不这么用,因为MySQL的数据都存在硬盘中,而从硬盘中对MySQL的操作,I/O花费的 ...
- rabbitmq和redis用作消息队列的区别
将redis发布订阅模式用做消息队列和rabbitmq的区别: 可靠性redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中:r ...
随机推荐
- FlashFXP免费版下载
http://www.wocaoseo.com/thread-294-1-1.html 关于互联网的上传下载软件可能有很多种,也有很多安装后免费使用的软件比如8UFTP等,但如果论起速度和功能性,个人 ...
- .NET Core3.1 Dotnetty实战第二章
一.概要 在上一篇文章讲到Dotnetty的基本认识,本文这次会讲解dotnetty非常核心的模块是属于比较硬核的干货了,然后继续往下讲解如何根据自己的需求或者自己的喜好去配置Dotnetty而不是生 ...
- JVM关键字try、catch、finally、return执行过程
关键字:jvm try catch finally return.指令 finally相当于在所有方法返回之前执行一次 finally中含有return其中finally中return会覆盖try和c ...
- python实用小技能分享,教你如何使用 Python 将 pdf 文档进行 加密 解密
上次说了怎么将word转换为pdf格式 及 实现批量将word转换为pdf格式(点击这里),这次我又get到一个新技能–使用 Python 将 pdf 文档进行 加密 解密,哈哈哈 希望帮到更多人! ...
- Python开发的入门教程(八)-迭代
介绍 本文主要介绍Python中迭代的基本知识和使用 什么是迭代 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Ite ...
- Fragment 1.2.0 更新记录
1.官方地址 https://developer.android.com/jetpack/androidx/releases/fragment 2.引入方法 dependencies { def fr ...
- ASP.NET Core 3.x控制IHostedService启动顺序浅探
想写好中间件,这是基础. 一.前言 今天这个内容,基于于ASP.NET Core 3.x. 从3.x开始,ASP.NET Core使用了通用主机模式.它将WebHostBuilder放到了通用的I ...
- 跟着兄弟连系统学习Linux-【day03】
day03-20200529 p10.学习注意事项 linux严格区分大小写(与python有点像) Linux中所有内容都是通过文件形式保存,通过命令执行设置参数,写 ...
- SQL Node 1.05版
输出: select a.f1, b.f2 from table01 a, ( select a from tb ) b where a.f1=1 and b.f2=2 or b.f3=3 order ...
- 论文:Show and Tell: A Neural Image Caption Generator-阅读总结
Show and Tell: A Neural Image Caption Generator-阅读总结 笔记不能简单的抄写文中的内容,得有自己的思考和理解. 一.基本信息 标题 作者 作者单位 发表 ...