当前位置: 首页 > news >正文

Java使用Redis实现消息队列

近期刷Java面试题刷到了“如何使用Redis实现消息队列”,解答如下:
一般使用 list 结构作为队列, rpush 生产消息, lpop 消费消息。当 lpop 没有消息的时候,要适当sleep 一会再重试。若不使用sleep,则可以用指令blpop(该指令在没有消息的时候,它会阻塞住直到消息到来)

目录

  • 引入Jedis
  • 指令简介
    • rpush
    • blpop
  • Java使用Redis实现消息队列

引入Jedis

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>

指令简介

rpush

rpush操作是向Redis服务器中的一个列表(List)中添加一个元素。这个操作通常用于向队列中添加任务或者数据。
语法:rpush key value1 [value2] [value3] …
示例:rpush my_list “task1” “task2” “task3”

blpop

blpop操作是用于移除并获取Redis服务器列表中的第一个元素,在该元素存在时会阻塞列表直到超时或发现可弹出的元素。
语法:blpop key1 [key2 …] timeout
示例:blpop my_list 5 (移除my_list中第一个元素且最多阻塞等待5秒钟)
多个列表可以这样写 blpop mylist1 mylist2 10

Java使用Redis实现消息队列

模拟生产者

import redis.clients.jedis.Jedis;

public class Producer {
    private Jedis jedis;
    private String queueName;

    public Producer(String queueName) {
        this.jedis = new Jedis("localhost", 6379);
        this.queueName = queueName;
    }

    public void produce(String message) {
        jedis.rpush(queueName, message);
    }
}

模拟消费者

import redis.clients.jedis.Jedis;
import java.util.List;

public class Consumer {
    private Jedis jedis;
    private String queueName;

    public Consumer(String queueName) {
        this.jedis = new Jedis("localhost", 6379);
        this.queueName = queueName;
    }

    public String consume() {
    	//参数1是阻塞时长,0代表不限时
        List<String> result = jedis.blpop(0, queueName);
        return result.get(1);
    }
}

生产者端测试

public class MainP {
    public static void main(String[] args) {

        Producer producer = new Producer("queue");

        Thread producerThread = new Thread(() -> {
            producer.produce("hello world");
        });

        producerThread.start();
    }
}

消费者端测试

public class MainC {

    public static void main(String[] args) {
        Consumer consumer = new Consumer("queue");

        Thread consumerThread = new Thread(() -> {
        	//当没有消息的时候,此处会自动堵塞等待消息
            while (true){
                String message = consumer.consume();
                System.out.println("消费消息: " + message);
            }
        });

        consumerThread.start();
    }
}

测试结果:开启消费者端后,当有消息生产时自动消费
在这里插入图片描述

一般情况下消息队列是直接使用mq来实现的,这边是学习的时候感兴趣顺带看下的。
在这里插入图片描述

相关文章:

  • 【算法】约瑟夫环问题解析与实现
  • 【正点原子STM32连载】 第五十二章 串口IAP实验 摘自【正点原子】APM32E103最小系统板使用指南
  • Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试
  • PTA | Wifi密码
  • 5G网络eMBB、uRLLC、mMTC
  • “分布式透明化”在杭州银行核心系统上线之思考
  • 前端判断对象为空
  • 掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验
  • redis为什么使用跳跃表而不是树
  • 二、ActiveMQ安装
  • Postgresql源码(124)两个事务更新同一行数据时的行为和原理分析
  • django定时任务(django-crontab)
  • notepad++打开文本文件乱码的解决办法
  • PCL常用的点云操作
  • RedisTemplate重写的一些模板
  • html的列表标签
  • 实习日志15
  • 操作系统——内存管理(附带Leetcode算法题LRU)
  • Qt QWidget以及各种控件、布局 核心属性(适合入门使用时查询)
  • proxy配置
  • 从孔雀尾巴到蒙娜丽莎,一个鸟类学博士眼中的“美”
  • 工行一季度净赚841亿元降3.99%,营收降3.22%
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电
  • 路边“僵尸车”被人以1450元卖了,嫌疑人被刑拘
  • 工信部:加快自动驾驶系统安全要求强制性国家标准研制
  • 纪录电影《中国有戏:天幕计划》启动,有望太空播放