Java使用Redis实现消息队列

近期刷Java面试题刷到了"如何使用Redis实现消息队列",解答如下:

一般使用 list 结构作为队列, rpush 生产消息, lpop 消费消息。当 lpop 没有消息的时候,要适当sleep 一会再重试。若不使用sleep,则可以用指令blpop(该指令在没有消息的时候,它会阻塞住直到消息到来)

目录

引入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实现消息队列

模拟生产者

java 复制代码
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);
    }
}

模拟消费者

java 复制代码
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);
    }
}

生产者端测试

java 复制代码
public class MainP {
    public static void main(String[] args) {

        Producer producer = new Producer("queue");

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

        producerThread.start();
    }
}

消费者端测试

java 复制代码
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来实现的,这边是学习的时候感兴趣顺带看下的。

相关推荐
骇客野人几秒前
Java 开发组件大全覆盖后端主流技术栈(基础、Web、ORM、中间件、微服务、安全、工具、测试、运维、信创适配常用组件)
java·前端·中间件
暖核3 分钟前
Redis 从基础到集群实战:数据类型、客户端、高可用架构完整梳理
数据库·redis·架构
2401_8888597122 分钟前
STM32H733 MPU、AXI、FMC学习
java·开发语言·stm32·spring
深蓝AI44 分钟前
Redis 文档 MCP 揭示 Agent 检索真相:3 个工具、双读路径,引用为什么不能交给模型编
人工智能·redis
CV工程师丁Sir2 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
Sarvartha9 小时前
final 关键字
java·开发语言
2601_952047799 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
数据狐(Datafox)10 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
禾小西11 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存