基于内存的单线程数据库,使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做消息队列的更多相关文章

  1. Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流

    1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...

  2. 程序员过关斩将--redis做消息队列,香吗?

    Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...

  3. Redis 做消息队列

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现.定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  4. Redis做消息队列

    1.连接从Redis中获取日志文件并存储到ES中 [root@Logstash ~]# vim /usr/local/logstash/config/redis.conf input {     be ...

  5. RabbitMQ跟Redis做消息队列的区别

    区别 https://www.zhihu.com/question/20795043 https://blog.csdn.net/dd18709200301/article/details/79077 ...

  6. Redis做消息队列文章两篇

    介绍:http://www.cnblogs.com/lhfcws/p/3732535.html 具体做法:http://shift-alt-ctrl.iteye.com/blog/1867454 另外 ...

  7. 使用Redis Stream来做消息队列和在Asp.Net Core中的实现

    写在前面 我一直以来使用redis的时候,很多低烈度需求(并发要求不是很高)需要用到消息队列的时候,在项目本身已经使用了Redis的情况下都想直接用Redis来做消息队列,而不想引入新的服务,kafk ...

  8. PHP使用Redis实现消息队列

    消息队列可以使用MySQL来实现,可以参考博客PHP使用MySQL实现消息队列,虽然用MySQL可以实现,但是一般不这么用,因为MySQL的数据都存在硬盘中,而从硬盘中对MySQL的操作,I/O花费的 ...

  9. rabbitmq和redis用作消息队列的区别

    将redis发布订阅模式用做消息队列和rabbitmq的区别: 可靠性redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中:r ...

随机推荐

  1. Java面试题(反射篇+对象拷贝篇)

    反射 57.什么是反射? 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力 Java反射: 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否 ...

  2. 华为云服务器安装hadoop2.7.5

    1. 安装环境 1.1硬件环境 1.1.1 NameNode 配置项 详细参数 主机 k8s-master CPU Intel(R) Xeon(R) Gold 6278C CPU @ 2.60GHz ...

  3. SDWebImage 清除磁盘缓存机制 iOS

    分析的版本 pod 'SDWebImage', '~> 5.0.6' SDWebImage默认清除磁盘缓存的时长是7天. /** * The maximum length of time to ...

  4. oeasy教您玩转linux010106这儿都有啥 ls

    回忆上次内容 上个实验我们查询了 ls 的手册: man ls

  5. RabbitMQ 3.8.7 在 centos7 上安装

    1.安装 erlang 因为 RabbitMQ 是 erlang 语言开发,所以需要依赖 erlang 环境,所以在安装 RabbitMQ 前需要先安装 erlang wget https://pac ...

  6. Activiti7 流程变量(UEL-Value方式)

    需求:请假天数大于3天走总经理审批,小于等于3天直接走人事 画图 因为IDEA不展示那个线上的东西,所以截屏自己写的,还有就是我感觉IDEA画图挺坑的,之前画了好几遍,一部署就报错,很奇怪 /** * ...

  7. Activiti7 提交任务

    package com.itheima.activiti; import org.activiti.engine.ProcessEngine; import org.activiti.engine.P ...

  8. Kubernetes 存活、就绪探针

    在设计关键任务.高可用应用程序时,弹性是要考虑的最重要因素之一. 当应用程序可以快速从故障中恢复时,它便具有弹性. 云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中.为了确保Kuber ...

  9. 分布式事务框架.NetCore CAP总结

    来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...

  10. Azure Storage 系列(五)通过Azure.Cosmos.Table 类库在.Net 上使用 Table Storage

    一,引言 上一篇文章我们在.NET 项目中添加了 “WindowsAzure.Storage” 的 NuGet 包进行操作Table 数据,但是使用的 “WindowsAzure.Storage”  ...