我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java redisTemplate阻塞式处理消息队列的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java redisTemplate阻塞式处理消息队列的示例分析

这篇文章主要介绍Java redisTemplate阻塞式处理消息队列的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Redis 消息队列

Java redisTemplate阻塞式处理消息队列的示例分析

redis五种数据结构

Java redisTemplate阻塞式处理消息队列的示例分析

队列生产者

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;@Slf4jpublic class QueueProducer implements Runnable {        public static final String QUEUE_PRODUCTER = "queue-producter";    private RedisTemplate<String, Object> redisTemplate;    public QueueProducer(RedisTemplate<String, Object> 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;@Slf4jpublic class QueueConsumer implements Runnable {    public static final String QUEUE_PRODUCTER = "queue-producter";    public static final String TMP_QUEUE = "tmp-queue";    private RedisTemplate<String, Object> redisTemplate;    public QueueConsumer(RedisTemplate<String, Object> redisTemplate) {        this.redisTemplate = redisTemplate;    }        @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);

Java redisTemplate阻塞式处理消息队列的示例分析

补充

redisTemplate处理/获取redis消息队列

(参考代码)

@Componentpublic class RedisQueue {    @Autowired    private RedisTemplate redisTemplate;              public boolean lpush(String key, Object value) {        try {            redisTemplate.opsForList().leftPush(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }         public Object rpop(String key) {        try {            return redisTemplate.opsForList().rightPop(key);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }         public Object brpop(String key, long timeout, TimeUnit timeUnit) {        try {            return redisTemplate.opsForList().rightPop(key, timeout, timeUnit);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }         public List<Object> lrange(String key, long start, long end) {        try {            return redisTemplate.opsForList().range(key, start, end);        } catch (Exception e) {            e.printStackTrace();            return null;        }    } }

以上是“Java redisTemplate阻塞式处理消息队列的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java redisTemplate阻塞式处理消息队列的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java redisTemplate阻塞式处理消息队列的示例分析

这篇文章主要介绍Java redisTemplate阻塞式处理消息队列的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis 消息队列redis五种数据结构队列生产者package cn.stylefen
2023-06-21

Java多线程之多种锁和阻塞队列的示例分析

这篇文章给大家分享的是有关Java多线程之多种锁和阻塞队列的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、悲观锁和乐观锁1.1. 乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以
2023-06-15

java并发中DelayQueue延迟队列原理的示例分析

这篇文章给大家分享的是有关java并发中DelayQueue延迟队列原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。介绍DelayQueue队列是一个延迟队列,DelayQueue中存放的元素必须实现
2023-06-15

Swoole和Workerman的消息队列与实时日志分析的协同处理能力

一、Swoole和Workerman简介1.1 SwooleSwoole是一款为PHP设计的高性能网络通信框架,它能够使PHP支持多进程、异步IO和协程等特性。Swoole提供了丰富的功能组件,如TCP/UDP服务器、WebSocket服务
2023-10-21

Swoole和Workerman的消息队列与实时数据分析的协同处理能力

一、消息队列的协同处理能力消息队列是一种通过异步方式处理多个任务的机制,常用于解决高并发问题和提高系统的可伸缩性。Swoole和Workerman都支持消息队列的使用,通过消息队列可以实现不同服务之间的解耦和协同处理,提高系统的整体性能。具
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录