redis 实现队列

一 使用场景

        在一些场景,项目已发布了一段时间了,只是需要完善或优化一些功能要用到队列,但不想改动太大(或者不想在安装第三方MQ组件框架)的情况下可以用redis实现队列 。

二 redis实现队列

       1 redis有序队列

  使用redis的list的数据类型轻松实现有序队列,该队列每次存储时放在左边第1个,从右边最后一个取出即先进去先出来,该队列大多数场景都适用,如果不知道使用什么队列好可以先尝试试用该队列。

 /*** REDIS有序队列*/public void pushOrder(String json) {stringRedisTemplate.opsForList().leftPush(KEY, json);}/*** REDIS有序队列*/public String popOrder() {return stringRedisTemplate.opsForList().rightPop(KEY);}

 假设分布式服务下的另外的springboot项目消费队列示例代码:

@Service
public class RedisOrderProcess {private static final Logger logger = LogManager.getLogger(RedisOrderProcess.class);@AutowiredRedisServiceImpl redisService;@PostConstructpublic void init() {int cpuCount = Runtime.getRuntime().availableProcessors();System.out.println("start RedisOrderProcess > cpus="+cpuCount);processOrderImport(cpuCount);}private void processOrderImport(int cpus) {ExecutorService executorService = new ThreadPoolExecutor(cpus, 1000,60L, TimeUnit.SECONDS,new LinkedBlockingQueue <Runnable>());executorService.execute(() -> {while (true) {String json=null;try{json=redisService.popOrder();if(json!=null){//订单业务处理代码}else{Thread.sleep(500);}}catch (Exception e){logger.error("err data> \n"+json,e);e.printStackTrace();}}});}}

2 redis无序队列

使用redis的hash的数据类型轻松实现无序队列,而且队列保存中的内容是唯一的,往往用到的一些场景很特殊,而且在某些场景运用比正规的队列组件还爽。

 在使用springboot框架下轻松实现生产端:

/*** 推送第三方设备状态** @param id* @param status*/public void pushStatus(String id, Integer status) {if(status==null){return;}String value = id+ ":" + status;stringRedisTemplate.opsForSet().add("PUSH_STATUS", value);}

 在使用springboot框架下轻松实现消费端:

@Service
public class RedisStatusProcess {private static final Logger logger = LogManager.getLogger(RedisStatusProcess.class);@AutowiredStringRedisTemplate stringRedisTemplate;@PostConstructpublic void init() {int cpuCount = Runtime.getRuntime().availableProcessors();System.out.println("start RedisStatusProcess > cpus="+cpuCount);processStatusImport(cpuCount);}private void procesStatusImport(int cpus) {ExecutorService executorService = new ThreadPoolExecutor(cpus, 1000,60L, TimeUnit.SECONDS,new LinkedBlockingQueue <Runnable>());executorService.execute(() -> {while (true) {String json=null;try{json=stringRedisTemplate.opsForSet().pop("PUSH_STATUS")if(json!=null){//状态业务处理代码}else{Thread.sleep(200);}}catch (Exception e){logger.error("err data> \n"+json,e);e.printStackTrace();}}});}}

       以上代码在我们的线上场景:我们当前2000个设备,每个设备每秒上传1个状态,如果使用有序队列就要 1分钟时间就要处理2000*60个状态,如果队列有延迟还意味着从队列获取的状态不是最新的,而且没有消费时可能会撑破内存。而使用无序队列就不存在问题,因为在队列中每个设备只允许一个状态,如果未消费则直接用最新的状态覆盖,拿出的基本都是最新的,也不用一定要消费到每个队列状态。 

安装与使用redis教程 -> http://t.csdnimg.cn/1Ltzm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在打日志时,如何使用snowflake-id快速方便得随机获取query的唯一id

步骤一&#xff1a;安装snowflake-id pip install snowflake-id步骤二&#xff1a;代码示例 from snowflake import SnowflakeGeneratorgen SnowflakeGenerator(42)for i in range(100):val next(gen)print(val)参考文档&#xff1a; https://pypi.org/project/snowflake-…

Linux 命令行调试WiFi

参考&#xff1a; Linux&#xff1a;命令行调试WiFi&#xff08;iwlist/iwconfig/iw/wpa_supplicant/wpa_cli/dhcp/hostapd/hostapd_cli的使用方法&#xff09;-CSDN博客 iwlist wlan0 scan[ning] 列出WiFi扫描结果 iwlist wlan0 ap/accesspoint/peers 列出热点信息 iwl…

Scrum敏捷转型机构哪家好推荐

对于企业而言&#xff0c;敏捷转型是提升竞争力、适应市场变化的重要手段。为了实现这一目标&#xff0c;许多知名的培训公司提供了专业的敏捷培训课程和认证。其中&#xff0c;Leangoo领歌以其全面的敏捷研发管理解决方案和多种认证课程而备受认可。 1、Leangoo领歌&#xff…

CentOS6.10 卸载MySQL8.0.34升级至8.0.35

准备要更新的MySQL安装包,下载地址:MySQL :: Download MySQL Community Server 查看当前MySQL版本 备份数据库 mysqldump -uroot -p -B > /opt/backup/20231220_mysql.sql 检查备份文件 查看所有服务项: service --status-all 可以看到我们注册的MySQL服务是mysqld 停止…

Vue - 基于Element UI封装一个表格动态列组件

1 组件需求背景 在后台管理系统中&#xff0c;表格的使用频率非常高&#xff0c;统一封装表格动态列组件并全局注册使用&#xff0c;可大大提升代码的复用性和可维护性。 2 全局注册 src/plugins/index.js&#xff1a; import columns from ./columns/indexexport default …

el-date-picker日期时间插件只允许选择年月日小时并做可选择范围限制(精确到小时的范围)

一、首先明确下这个需求 1、要求只能选择年月日时,不要分钟和秒 2、根据后台返回的开始时间和天数设置可选择的开始时间和结束时间范围(包含小时)比如后台返回的开始时间是2023-12-20 13:24:30,天数365天,那么我们需要限制当前可选日期为2023-12-20 14时(不能选小于13:2…

嵌入式系统复习--ARM指令集(一)

文章目录 上一篇ARM指令集概述ARM寻址方式下一篇 上一篇 嵌入式系统复习–ARM技术概述 ARM指令集概述 ARM指令集是32位的&#xff0c;程序的启动都是从ARM指令集开始。 指令编码 第一操作数 第二操作数 目的操作数 条件影响标志位 不同功能实现的二进制位 指令编码 第…

银行敏捷转型对员工有哪些要求,供参考

银行进行敏捷转型时&#xff0c;对员工通常有一些要求和期望&#xff1a; 灵活性和适应性&#xff1a; 员工需要具备适应快速变化和不断迭代的工作环境的能力。他们需要对变化持开放态度&#xff0c;并愿意适应敏捷方法所带来的灵活性。 跨职能团队合作&#xff1a; 敏捷转型强…

华清远见嵌入式学习——ARM——作业2

目录 作业要求&#xff1a; 现象&#xff1a; 代码&#xff1a; 思维导图&#xff1a; 模拟面试题&#xff1a; 作业要求&#xff1a; GPIO实验——3颗LED灯的流水灯实现 现象&#xff1a; 代码&#xff1a; .text .global _start _start: /************对led1的设置****…

Java8新特性 Stream

首先创建一个用户的实体类&#xff0c;包括姓名、年龄、性别、地址、赏金 几个属性 Data public class User {//姓名private String name;//年龄private Integer age;//性别private Integer sex;//地址private String address;//赏金private BigDecimal money;public User(St…

【解决Typora图片不是显示问题】PicGo+Github+Typora+ onedrive/坚果云 实现笔记同步

【解决Typora图片不是显示问题】PicGo、Github、Typora实现笔记同步 写在前面&#xff1a; typora笔记软件使用记录typora图片上传问题&#xff1a;原因分析&#xff1a;解决方案&#xff1a;PicGoGithubTypora 坚果云/onedrive 实现笔记同步第一步. 设置上传模式&#xff1a;u…

华为安防监控摄像头

华为政企42 华为政企 目录 上一篇华为政企城市一张网研究报告下一篇华为全屋wifi6蜂鸟套装标准

Hypervisor Display架构

Hypervisor Display架构部分 1&#xff0c;所有LA侧的APP与显示相关的调用最终都会交由SurfaceFlinger处理 2&#xff0c;SurfaceFlinger会最终调用android.hardware.graphics.composer2.4-service服务 3&#xff0c;android.hardware.graphics.composer2.4-service服务会调用G…

一、神经元与激活函数

神经网络是一种大规模的并行分布式处理器&#xff0c;天然具有存储并使用经验知识的能力。它从两个方面上模拟大脑:(1)网络获取的知识是通过学习来获取的;(2)内部神经元的连接强度&#xff0c;即突触权重&#xff0c;用于储存获取的知识。—— Haykin [1994] 生物学家在20世纪初…

CSS之em、px、rem的区别

前端 作为一个前端开发工程师&#xff0c;关于这些长度单位还是得了解一下。虽然在日常的开发中px、%用的多些&#xff0c;也会用到vh、vw&#xff0c;其他的虽然用的少但也得了解&#xff0c;说不定就能解决你样式中的问题呢。 计量单位 在css中计量单位分相对长度单位和绝…

XILINX-Zynq UltraScale+MPSoc 开发笔记

1. 资料信息 2. IDE集成开发环境 3. petalinux开发 3.1 环境搭建 1. 创建一个ubuntu18.04&#xff08;或者其他版本&#xff09;&#xff0c;根据UG1144文档安装ubuntu下对petalinux的依懒工具。 2. 下载petalinux对应版本&#xff0c;链接&#xff1a;Downloads (xilinx.co…

【mysql】出错 Subquery returns more than 1 row

问题 查找出一下子查询返回超过1行 SELECT cc.id,DATE_FORMAT(cc.CREATE_TIME,%Y%m%d) as day_id, IFNULL((select f.source FROM strong_contact_fea f where f.id cc.id and STR_SPEC_IDS2023091145),10501) as strong_prod_level_1, IFNULL((select f.source from stron…

Python---端口和端口号的介绍

1. 问题思考 不同电脑上的飞秋之间进行数据通信&#xff0c;它是如何保证把数据给飞秋而不是给其它软件呢? 其实&#xff0c;每运行一个网络程序都会有一个端口&#xff0c;想要给对应的程序发送数据&#xff0c;找到对应的端口即可。 端口效果图: 2. 什么是端口 端口是传…

iOS将framework转为xcframework

拆分framework 先把framework拷贝到两个文件夹下边&#xff0c;这里只需要armv7、arm64、x86_64。 mkdir iphoneos iphonesimulator cp -R mysdk.framework iphoneos cp -R mysdk.framework iphonesimulator 把iphoneos中的模拟器指令集删除&#xff0c;只保留armv7和arm64 …

电巢助力第十届图像技术高峰论坛圆满落幕,回顾西电与电巢的校企合作四年硕果累累

图像技术高峰论坛圆满落幕 12月17日&#xff0c;由中国图象图形学学会、陕西省科学技术协会主办、西安电子科技大学通信工程学院、陕西省创新驱动共同体承办的“第十届图像技术高峰论坛暨陕西第五届图像处理与分析研讨会”在陕西西安成功举办。电巢科技作为本次论坛的承办单位&…