转:https://www.cnblogs.com/nullcc/p/5924244.html

问题:如果一个并发很大的消息应用,想要根据请求的优先级来处理?

答案:用Redis

详解:

一是并发量大,二是请求的优先级。

先谈谈并发量大,对于一个消息系统,服务端必然会接受很多客户端的请求,这些请求一般来说都是异步的,用户不必等待请求被处理。对于这类需求,我们需要有一个能缓存住大量消息请求的东西,用redis来做这个是非常合适的。基本上来说,redis能缓存住的消息数量只取决于内存大小,而且我们需要的只是队列最基本的操作:进队和出队,它们的时间复杂度都是O(1),因此性能上很高。

具体来说,redis里面有一个list结构,我们可以利用list构造一个FIFO(先进先出)的队列,所有请求就在这个队列里面排队等待处理。redis的list有lpush,rpush,lpop和rpop这么几个常用的操作,如果我们要构造FIFO队列,可以用lpush和rpop(或者用rpush和lpop),注意进队和出队方向相反即可。

第二个关键字,请求的优先级。我们先假设一个最简单的场景,有三个优先级:高中低三级。可以设置3个list结构,比如叫queue_h,queue_m,queue_l,分别对应三个优先级。我们的代码流程可以这样来写:

首先设置3个优先级的list。

写入端:

1. 根据请求的优先级往相应list里lpush数据。

读出端:

1. 可以采用定时轮询的方式,按序依次检查高、中、低三个list的长度(可以使用llen命令),如果该list长度大于0,说明当前队列需要立即被处理。

2. 从这个list中rpop数据,然后处理数据。

需要注意的是,因为有分优先级,所以只有在高优先级的请求都被处理完以后才能去处理中低优先级的请求,这是一个大前提。

有人可能会问,如果我的优先级分类远大于3个呢,比如有1000个优先级怎么办,总不能设置1000个list吧,这样太蛋疼了。这种情况也不是完全没可能,也许有的系统就是这么多优先级呢。

这种需求我们可以结合分段来处理,比如0-99,100-199...900-999,先把优先级分成几个等分,然后在各个分段中使用有序集合,有序集合可以对集合内的元素排序,有序集合在插入一个元素的时候使用二分查找法,所以在比较大的数据量面前效率还是可以的,如果请求数实在太多,可以考虑进一步细分优先级的分段,以减少有序列表元素的数量。在一个请求进来时,首先确定它的优先级分段,把这个请求放到相应的有序集合中。在处理部分,需要有一个服务书按优先级高到低顺序遍历优先级的分段,然后直接取优先级最高的请求来处理(在有序集合中取最高或最低的元素时间复杂度都是O(1))。

java消费轮询redis队列_redis实现队列相关推荐

  1. java 员工轮询值班排班 开发设计(mysql+redis)

    JAVA 员工轮询 值班 排班 1.设计一个值班历史纪录表 duty_employee_history(area_id,dept_id) 联合主键,存放已值班过的数据 area_id int(11) ...

  2. RocketMQ 消息消费 轮询机制 PullRequestHoldService

    1. 概述 先来看看 RocketMQ 消费过程中的轮询机制是啥.首先需要补充一点消费相关的前置知识. 1.1 消息消费方式 RocketMQ 支持多种消费方式,包括 Push 模式和 Pull 模式 ...

  3. java 长轮询_java – Spring中的长轮询

    我们有一个独特的案例,我们需要与外部API接口,这需要我们长时间轮询他们的端点以获得他们所谓的实时事件. 问题是我们可能有多达80,000人/设备在任何给定时间点击此端点,监听事件,每个设备/人1个连 ...

  4. java线程轮询_基于springboot实现轮询线程自动执行任务

    本文使用: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, 但不能在指定 ...

  5. java ajax轮询_ajax轮询(ajax轮询实现聊天)

    最近一直在研究ajax长轮询连实现即时通信,但是到底是个怎么轮询法?难道. 一般最原始的作法就是在客户端搞个定时器一直向后台请求,而ajax的长轮询与一般的http连接不一样,它发送的是长连接,比如说 ...

  6. java 长轮询_基于springboot 长轮询的实现操作

    springboot 长轮询实现 基于 @EnableAsync , @Sync @SpringBootApplication @EnableAsync public class DemoApplic ...

  7. java定时轮询_RxJava应用场景之轮询定时任务

    Android开发中必不可少会遇到轮询或定时任务,在RxJava诞生之前,我们常常使用Handler+postDelay,或者Java中的Timer来实现,实际上RxJava也可以实现这类需求.下面, ...

  8. java timer 轮询_java 定时器分析

    前段时间做一个springMVC项目,有一个功能是要定时拉取数据.做法就是启动一个定时器,定时这行.java有自带的定时器,不过在springMVC中不好集成,而且由于使用springMVC,很 多都 ...

  9. java ajax轮询_ajax轮询

    http://blog.csdn.net/qq_23412263/article/details/70260057 原理 普通的jquery ajax轮询的原理主要是,客户端通过定时器定时发送ajax ...

最新文章

  1. 【大数据】SparkSql 连接查询中的谓词下推处理 (一)
  2. ip地址详解,ip地址各种写法的意义,私有局域网搭建(IPv4)
  3. linux大端小端命令,linux的大小端、网络字节序问题
  4. UVALive - 7511 Multiplication Table(暴力+模拟)
  5. CTF dotNet逆向分析
  6. 代理缓存服务器squid
  7. 智领云荣登“中国大数据企业50强” | 2020大数据产业生态大会盛大召开 智领云斩获多项殊荣
  8. c语言实验五函数答案,C语言程序设计实验五 参考答案.doc
  9. Spinlock 简介(转)
  10. 注册登录时本地图片验证码
  11. 如何自己制作一个web项目Tomcat+war包的Docker镜像
  12. 「三分钟系列07」3分钟看懂哈夫曼树与哈夫曼编码
  13. 闭包、循环setTimeout、立即执行函数
  14. android最新文献,android开发参考文献
  15. STM32F205 HAL库 RTC软件复位后不准
  16. ZN200以太网转串口TTL(1)
  17. linux bzip指定名称,Linux基础命令---bzip2
  18. Python爬虫学习简单入门(第四含scrapy安装)
  19. 学学习笔记:利用TCGA Assembler工具下载及处理数据
  20. 转:心理学相关经典书籍

热门文章

  1. pkl中文意思_王者荣耀坦克回复流是什么意思 PKL联赛最强坦克回复流阵容玩法...
  2. [Vulhub] Nginx漏洞
  3. 【清晨平台记录一】平台说明、思路+代码框架
  4. linux adc检测,Linuxatsadc输入文件如何检查漏洞?
  5. 幼儿园分班问题(C语言)
  6. 判断map集合是否为空和是否为null
  7. sql查询结果列转行
  8. 还在看美女直播跳舞,过时啦老夫反手就是一波用jmeter对直播间做压测
  9. 机房收费——Excel打开调整与注册控件的实现
  10. EZView支持多少用户同时登陆查看