Java redisTemplate阻塞式处理消息队列的示例分析
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍Java redisTemplate阻塞式处理消息队列的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis 消息队列redis五种数据结构队列生产
千家信息网最后更新 2025年01月16日Java redisTemplate阻塞式处理消息队列的示例分析
这篇文章主要介绍Java redisTemplate阻塞式处理消息队列的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Redis 消息队列
redis五种数据结构
队列生产者
package cn.stylefeng.guns.knowledge.modular.knowledge.schedule;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.RedisTemplate;import java.util.Random;import java.util.UUID;/** ** 队列生产者 *
* * @SINCE 2021/11/30 21:03 * @AUTHOR dispark * @Date: 2021/11/30 21:03 */@Slf4jpublic class QueueProducer implements Runnable { /** * 生产者队列 key */ public static final String QUEUE_PRODUCTER = "queue-producter"; private RedisTemplateredisTemplate; public QueueProducer(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Override public void run() { Random random = new Random(); while (true) { try { Thread.sleep(random.nextInt(600) + 600); // 1.模拟生成一个任务 UUID queueProducerId = UUID.randomUUID(); // 2.将任务插入任务队列:queue-producter redisTemplate.opsForList().leftPush(QUEUE_PRODUCTER, queueProducerId.toString()); log.info("生产一条数据 >>> {}", queueProducerId.toString()); } catch (Exception e) { e.printStackTrace(); } } }}
队列消费者
package cn.stylefeng.guns.knowledge.modular.knowledge.schedule;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.RedisTemplate;import java.util.Random;/** ** 队列消费者 *
* * @SINCE 2021/11/30 21:14 * @AUTHOR dispark * @Date: 2021/11/30 21:14 */@Slf4jpublic class QueueConsumer implements Runnable { public static final String QUEUE_PRODUCTER = "queue-producter"; public static final String TMP_QUEUE = "tmp-queue"; private RedisTemplateredisTemplate; public QueueConsumer(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } /** * 功能描述: 取值 - - 推荐使用 * * @author dispark * @date 2021/11/30 21:17 */ @Override public void run() { Random random = new Random(); while (true) { // 1.从任务队列"queue-producter"中获取一个任务,并将该任务放入暂存队列"tmp-queue" Long ququeConsumerId = redisTemplate.opsForList().rightPush(QUEUE_PRODUCTER, TMP_QUEUE); // 2.处理任务----纯属业务逻辑,模拟一下:睡觉 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 3.模拟成功和失败的偶然现象,模拟失败的情况,概率为2/13 if (random.nextInt(13) % 7 == 0) { // 4.将本次处理失败的任务从暂存队列"tmp-queue"中,弹回任务队列"queue-producter" redisTemplate.opsForList().rightPush(TMP_QUEUE, QUEUE_PRODUCTER); log.info(ququeConsumerId + "处理失败,被弹回任务队列"); } else { // 5. 模拟成功的情况,将本次任务从暂存队列"tmp-queue"中清除 redisTemplate.opsForList().rightPop(TMP_QUEUE); log.info(ququeConsumerId + "处理成功,被清除"); } } }}
测试类
@Test public void QueueThreadTotalEntry() throws Exception { // 1.启动一个生产者线程,模拟任务的产生 new Thread(new QueueProducer(redisTemplate)).start(); Thread.sleep(15000); // 2.启动一个线程者线程,模拟任务的处理 new Thread(new QueueConsumer(redisTemplate)).start(); // 3.主线程 Thread.sleep(Long.MAX_VALUE); }
并发情况下使用increment递增
线程一:
Long increment = redisTemplate.opsForValue().increment("increment", 1L); log.info("队列消费者 >> increment递增: {}", increment);
线程二:
Long increment = redisTemplate.opsForValue().increment("increment", 1L); log.info("生产者队列 >> increment递增: {}", increment);
补充
redisTemplate处理/获取redis消息队列
(参考代码)
/** * redis消息队列 */@Componentpublic class RedisQueue { @Autowired private RedisTemplate redisTemplate; /** ---------------------------------- redis消息队列 ---------------------------------- */ /** * 存值 * @param key 键 * @param value 值 * @return */ public boolean lpush(String key, Object value) { try { redisTemplate.opsForList().leftPush(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 取值 -* @param key 键 * @return */ public Object rpop(String key) { try { return redisTemplate.opsForList().rightPop(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 取值 - - 推荐使用 * @param key 键 * @param timeout 超时时间 * @param timeUnit 给定单元粒度的时间段 * TimeUnit.DAYS //天 * TimeUnit.HOURS //小时 * TimeUnit.MINUTES //分钟 * TimeUnit.SECONDS //秒 * TimeUnit.MILLISECONDS //毫秒 * @return */ public Object brpop(String key, long timeout, TimeUnit timeUnit) { try { return redisTemplate.opsForList().rightPop(key, timeout, timeUnit); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 查看值 * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return */ public List
以上是"Java redisTemplate阻塞式处理消息队列的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
队列
任务
处理
消息
线程
生产
生产者
成功
情况
消费者
消费
示例
分析
阻塞
内容
数据
时间
篇文章
参考
推荐
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
方舟服务器没人时间
创建数据库的通用软件
武警部队网络安全教育
前端如何把数据库的数据渲染
植物识别算法使用的数据库
服务器突然连不上
服务器安全措施有哪些
浙江室外农业信息系统数据库
ftp数据库动态库
云服务器价格对比
数据库常用工具
公司与网络技术部安全责任书
数据库锁使用
无线传感器网络技术项目书
英德深圳java软件开发
dell服务器配管理地址
动漫和网络技术哪个好
网络服务器怎样运作的
大网络安全技术
明日之后最良心服务器
制定《网络安全审查办法》的目的
中国信用数据库发信息催款
宝山区挑选网络技术服务哪里好
dns数据库保存域名
sql附加定位数据库文件
计算机网络及网络安全的概念
怎么查数据库的归档日志
渭南跑腿app软件开发费用
学软件开发的二本大学
网络安全你我同行手抄报怎么画