Springboot 实现Redis消息队列
Springboot 实现Redis 消息队列
之前被面试官问到怎么实现Redis的消息队列,我人麻了,当时一个劲的摇头,娘的,欺负我那时知识少,恶心啊
最近看到一个Demo,然后随笔记录了一篇,以便记录自己的成长过程。
一、废话不多bb,直接上干货
1、IDEA新建一个Springboot工程,取名为RedisQuene
2、导入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>
3、修改 application.yml 配置
spring:redis:host: 127.0.0.1database: 0port: 6379jedis:pool:max-active: 256max-idle: 8min-idle: 1server:port: 8080tomcat:uri-encoding: utf-8
4、新建一个config包,导入Redis配置
@Configuration
public class RedisConfig {@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Beanpublic 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;}
}
5、新建一个service包,写一个接口
public interface MQService {void produce(String string);void consume();void blockingConsume();}
5、写一个该接口的实现类,实现业务代码
@Service
public class MQServiceImpl implements MQService {private static Logger log = LoggerFactory.getLogger(MQServiceImpl.class);private static final String MESSAGE_KEY = "message:queue";// blpop 是阻塞式列表的弹出原语。当给定列表内没有任何元素可供弹出的时候, 连接将被 blpop 命令阻塞。
// 直到有另一个客户端对给定的这些 key 的任意一个执行 lpush 或 rpush 命令为止。
// 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素//brpop超时时间 Jessica 2021-11-05private static final int TIME_OUT=10;@Resourceprivate RedisTemplate redisTemplate;@Overridepublic void produce(String string) {redisTemplate.opsForList().leftPush(MESSAGE_KEY, string);}@Overridepublic void consume() {String string = (String) redisTemplate.opsForList().rightPop(MESSAGE_KEY);log.info("consume : {}", string);}public void blockingConsume() {List<Object> obj = redisTemplate.executePipelined(new RedisCallback<Object>() {@Nullable@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {//队列没有元素会阻塞操作,直到队列获取新的元素或超时return connection.bLPop(TIME_OUT, MESSAGE_KEY.getBytes());}},new StringRedisSerializer());for (Object str: obj) {log.info("blockingConsume : {}", str);}}}
5、新建一个controller包,controller调用service方法
@RestController
@RequestMapping(value="/api")
public class MQController {@Resourceprivate 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() throws Exception{//第一种,没有参数的Redis 队列,会不停连接,连接失败会自动断开 Jessica 2021-11-05
// while (true) {// mQService.consume();
// }//第二种,即使没有参数,会陷入阻塞阶段mQService.blockingConsume();}}
7、开启windows的Redis,没有安装包可以去官网下载一个,这里要强调一下,Redis是CS架构的,我们下载Redis安装包(必须是Windows版)后,需要先启动Redis,进入Redis安装的根目录,然后输入命令,启动服务端
E:\DevelopTools\redis>redis-server.exe redis.windows.conf
8、然后我们启动RedisQuene工程,在浏览器输入key=1,生产消息
9、在另外一个浏览器窗口消费一个消息
10、在IDEA控制台,我们可以查看消息接收完成,OK
总结:brpop帮助我们在没有数据的情况下,不会陷入重复连接的情况,很好的处理数据的请求。
各位观众老爷们,创作不易,麻烦点赞、关注、收藏,谢谢!
Springboot 实现Redis消息队列相关推荐
- springboot整合redis消息队列
前言 消息队列作为一种常用的异步通信解决方案,而redis是一款高性能的nosql产品,今天就给大家介绍一下,如何使用redis实现消息队列,并整合到springboot. 两个消息模型 1. 队列模 ...
- SpringBoot使用Redis消息队列 实现生产/消费者
文章目录 一.redis 依赖和配置源 二.消费者 2.1.生产者和消息公共的代码 消息队列 key 2.2.redis 消息队列相关配置 1).MsgConsumer 定义公共消息接口 2).Red ...
- springboot:整合redis消息队列
整合redis消息队列 项目依赖 <!-- RedisTemplate --><dependency><groupId>org.springframework.bo ...
- redis 消息队列 延时队列
redis 消息队列 Spring boot 2.0 基于Redis快速实现消息队列pub/sub功能 Springboot+Redis实现消息队列(生产者/消费者.发布订阅模式) SpringBoo ...
- Redis消息队列发展历程
简介:Redis是目前最受欢迎的kv类数据库,当然它的功能越来越多,早已不限定在kv场景,消息队列就是Redis中一个重要的功能.Redis从2010年发布1.0版本就具备一个消息队列的雏形,随着10 ...
- Redis 消息队列的三种方案(List、Streams、Pub/Sub)
现如今的互联网应用大都是采用 分布式系统架构 设计的,所以 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段,它具有 低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 当前使用较多 ...
- 如何保证 Redis 消息队列中的数据不丢失?
Redis 最常见的业务场景就是缓存读取与存储,而随着时间的推移,有人开始将它作为消息队列来使用了,并且随着 Redis 版本的发展,在 Redis.2.0.0 中新增了发布订阅模式(Pub/Sub) ...
- 【Redis消息队列实现异步秒杀】--Redis学习笔记08
前言 秒杀业务的优化思路: 先利用Redis完成库存余量.一人一单判断,完成抢单业务 再将下单业务放入队列中(阻塞队列,消息队列),利用独立线程异步下单 基于阻塞队列的异步秒杀存在哪些问题? 内存限制 ...
- PHP借用Redis消息队列实现高并发下发送邮件功能
参考: 我目前的做法是,借用redis的队列,把要发送的消息,全部放到里面,然后就不管了 有一个后台发送进程,来处理队列里面的数据 1.如果需要重发,则把发送失败的消息放到一个备份的队列里,每次循环开 ...
最新文章
- C#引用C++ Dll 所有類型轉換的方式(转)
- qtplaintextedit如何删除内容_(mac常见问题)如何删除 Mac 储存空间的其他选项?...
- 视觉注意力机制(上)
- 一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)
- 来自顶级名校推荐的英文书单,留着慢慢啃!
- Redis——持久化RDB和AOF
- 大数据是国家目前急需的技术领域
- 计算机视觉应用期末试卷,计算机视觉期末复习
- 2018年TI杯大学生电子设计竞赛题C-无线充电电动小车 题目加答案,非常详细
- 服务器配置高点网站打开速度,网站打开速度慢,你必须要解决的事?
- 币圈投资必败的5种“韭菜”人格
- 虚拟资源项目是什么?依靠虚拟资源项目月入万元能实现吗?
- Random不出现重复数字
- 【web-ctf】ctf_BUUCTF_web(2)
- 鸿蒙负责人王成录被曝已离职:华为技术元老,1998年哈工大博士毕业后加入
- Focal Loss for Dense Object Detection(整理后转载)
- 制作ipad iphone充电线
- 麒麟A1手表升级鸿蒙,麒麟A1自研芯片加持,打造年度续航旗舰手表华为WATCH GT 2...
- S7-200SMART案例分析——运动控制编程(三)
- 王晓昀-PowerDesigner与模型驱动开发-UMLChina讲座-音频和幻灯
热门文章
- SSM框架搭建的步骤
- Creo文件怎么保存为HTML文件,将Creo装配体的每个部件保存成单独的STP格式 | 坐倚北风...
- Python购物车案例(改善)
- C++ lambda函数详解
- idea 配置多个git账号_IDEA配置git
- 微信提示发送视频不能超过25M!这2个简单方法,一键轻松发送
- docker安装部署ansible并打包
- Spring Cloud | 第二篇:服务消费者(Ribbon)
- linux安装kde桌面环境,在Debian 10(Buster)上安装KDE桌面环境的方法
- CarSim仿真快速入门(二十一)-CarSim: 车轮箭头动画和其他指示动画