电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot集成Redis實現消息隊列的方法

瀏覽:23日期:2023-03-25 13:14:54
list 原理說明

Redis 的 list 是按照插入順序排序的字符串鏈表。

SpringBoot集成Redis實現消息隊列的方法

如圖所示,可以通過 lpush 和 rpop 或者 rpush 和 lpop 實現消息隊列。

1 lpush 和 rpop

SpringBoot集成Redis實現消息隊列的方法

2 rpush 和 lpop

SpringBoot集成Redis實現消息隊列的方法

消息隊列功能實現

引入 Redis 依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

applicat.yml添加Redis配置

spring: redis: host: 127.0.0.1 database: 0 port: 6379 jedis: pool: max-active: 256 max-idle: 8 min-idle: 1

Redis配置類

package com.sb.config; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer; @Configurationpublic class RedisConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; } }

MQ發送和接收接口

package com.sb.service; public interface MQService { void produce(String string); void consume();}

MQ發送和接收實現類

package com.sb.service.impl; import com.sb.service.MQService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;import org.springframework.lang.Nullable;import org.springframework.stereotype.Service; import javax.annotation.Resource;import java.util.List; @Servicepublic class MQServiceImpl implements MQService { private static Logger log = LoggerFactory.getLogger(MQServiceImpl.class); private static final String MESSAGE_KEY = 'message:queue'; @Resource private RedisTemplate redisTemplate; @Override public void produce(String string) { redisTemplate.opsForList().leftPush(MESSAGE_KEY, string); } @Override public void consume() { String string = (String) redisTemplate.opsForList().rightPop(MESSAGE_KEY); log.info('consume : {}', string); } }

MQ發送和接收API接口

package com.sb.controller; import com.sb.service.MQService;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController@RequestMapping(value='/api')public class MQController { @Resource private MQService mQService; @RequestMapping(value = '/produce', method=RequestMethod.GET) public void produce(@RequestParam(name = 'key') String key) { mQService.produce(key); } @RequestMapping(value='/consume', method=RequestMethod.GET) public void consume() { while (true) { mQService.consume(); } } }消息隊列功能測試

調用 http://localhost:8080/api/produce 接口往隊列里面添加 a、b、c、d元素。

SpringBoot集成Redis實現消息隊列的方法

調用 http://localhost:8080/api/consume 消費隊列里面的元素。

SpringBoot集成Redis實現消息隊列的方法

從截圖我們可以看到,即使當隊列為空,消費者依然在不停的 pop 數據,這就是浪費生命的空輪詢。

那如何解決這個空輪詢的問題呢?

你也許會想使用 Thread.sleep() 讓消費者線程隔一段時間再消費。

使用 Thread.sleep() 會有什么問題么?

A 如果生產者速度大于消費者消費速度,消息隊列長度會一直增大,時間久了會占用大量內存空間。

B 如果睡眠時間過長,這樣不能處理一些時效性的消息,睡眠時間過短,也會在連接上造成比較大的開銷。

有沒有更優雅和更合適的方式呢?

brpop 和 blpop 實現阻塞讀取,下面以 blpop 為例來說明問題。

blpop 理論說明

blpop 命令

blpop key1...keyN timeout

blpop 說明

blpop 是阻塞式列表的彈出原語。 當給定列表內沒有任何元素可供彈出的時候, 連接將被 blpop 命令阻塞。直到有另一個客戶端對給定的這些 key 的任意一個執行 lpush 或 rpush 命令為止。

當給定多個 key 參數時,按參數 key 的先后順序依次檢查各個列表,彈出第一個非空列表的頭元素。

key1...keyN:表示不同的隊列名。

timeout:阻塞隊列超時時間。

SpringBoot集成Redis實現消息隊列的方法

blpop 代碼實現

public void blockingConsume() { List<Object> obj = redisTemplate.executePipelined(new RedisCallback<Object>() { @Nullable @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { //隊列沒有元素會阻塞操作,直到隊列獲取新的元素或超時 return connection.bLPop(TIME_OUT, MESSAGE_KEY.getBytes()); } },new StringRedisSerializer()); for (Object str: obj) { log.info('blockingConsume : {}', str); }}

SpringBoot集成Redis實現消息隊列的方法

阻塞線程每隔10s超時執行一次。該方法解決了 CPU 空轉的問題。

到此這篇關于SpringBoot集成Redis實現消息隊列的方法的文章就介紹到這了,更多相關SpringBoot Redis消息隊列內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | 泰安塞纳春天装饰公司【网站】 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 植筋胶-粘钢胶-碳纤维布-碳纤维板-环氧砂浆-加固材料生产厂家-上海巧力建筑科技有限公司 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 杰恒蠕动泵-蠕动泵专业厂家-19年专注蠕动泵 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 安徽成考网-安徽成人高考网 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 柔性测斜仪_滑动测斜仪-广州杰芯科技有限公司| 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 电销卡 防封电销卡 不封号电销卡 电话销售卡 白名单电销卡 电销系统 外呼系统 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 新疆系统集成_新疆系统集成公司_系统集成项目-新疆利成科技 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 针焰试验仪,灼热丝试验仪,漏电起痕试验仪,水平垂直燃烧试验仪 - 苏州亚诺天下仪器有限公司 | 河南中专学校|职高|技校招生-河南中职中专网| ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 |