java redis 推送_java实现Redis消息发布和订阅

本文介绍了如何使用Java和Redis进行消息发布和订阅。通过PUBLISH命令发送消息到指定频道,SUBSCRIBE命令订阅频道接收消息。示例代码展示了使用Jedis库创建发布者、订阅者和订阅消息处理类的详细步骤。
部署运行你感兴趣的模型镜像

我再次觉得在简单消息应用的场景使用redis实在很方便,不仅可以使用smove或RPOPLPUSH等命令实现消息不丢失(ack模式),也可以直接使用pop和push来消费和发布消息,更可以使用PUBLISH/SUBSCRIBE发布订阅的模式。

1.Redis发布订阅架构

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。

发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

2.Redis发布订阅功能

(1)发送消息

Redis采用PUBLISH命令发送消息,其返回值为接收到该消息的订阅者的数量。

这里写图片描述

(2)订阅某个频道

Redis采用SUBSCRIBE命令订阅某个频道,其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。

3.代码案例:

3.1首先引入相关依赖

redis.clients

jedis

2.9.0

3.2定义消息发布者类-Publisher

package com.cicc.config.management.subsciber;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Publisher extends Thread{

private final JedisPool jedisPool;

public Publisher(JedisPool jedisPool) {

this.jedisPool = jedisPool;

}

@Override

public void run() {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

Jedis jedis = jedisPool.getResource(); //连接池中取出一个连接

while (true) {

try {

jedis.publish("mychannel", reader.readLine()); //从 mychannel 的频道上推送消息

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

3.3定义消息订阅类-SubThread

package com.cicc.config.management.subsciber;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

public class SubThread extends Thread {

private final JedisPool jedisPool;

private final Subscriber subscriber = new Subscriber();

private final String channel = "mychannel";

public SubThread(JedisPool jedisPool) {

super("SubThread");

this.jedisPool = jedisPool;

}

@Override

public void run() {

System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));

Jedis jedis = null;

try {

jedis = jedisPool.getResource(); //取出一个连接

jedis.subscribe(subscriber, channel); //通过subscribe 的api去订阅,入参是订阅者和频道名

} catch (Exception e) {

System.out.println(String.format("subsrcibe channel error, %s", e));

} finally {

if (jedis != null) {

jedis.close();

}

}

}

}

3.4定义订阅消息处理类-Subscriber 继承了JedisPubSub,其中onMessage可以根据业务需求来重写

package com.cicc.config.management.subsciber;

import redis.clients.jedis.JedisPubSub;

public class Subscriber extends JedisPubSub {

public Subscriber(){}

@Override

public void onMessage(String channel, String message) { //收到消息会调用

System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));

}

@Override

public void onSubscribe(String channel, int subscribedChannels) { //订阅了频道会调用

System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",

channel, subscribedChannels));

}

@Override

public void onUnsubscribe(String channel, int subscribedChannels) { //取消订阅 会调用

System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",

channel, subscribedChannels));

}

}

3.5编写测试类:PSTest

package com.cicc.config.management.test;

import com.cicc.config.management.subsciber.Publisher;

import com.cicc.config.management.subsciber.SubThread;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

public class PSTest{

public static void main( String[] args )

{

// 连接本地redis服务端

JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);

Publisher publisher = new Publisher(jedisPool); //发布者

publisher.start();

SubThread subThread = new SubThread(jedisPool); //订阅者

subThread.start();

}

}

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

Java实现Redis的实时推送可以使用Redis的发布/订阅功能。Redis的发布/订阅功能是一种消息传递模式,它允许发送者(发布者)向一个或多个接收者(订阅者)发送消息。下面是使用Spring BootRedis实现Redis消息发布与监听的示例代码: 1. 添加Redis依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis连接 在application.properties文件中添加Redis连接配置: ``` spring.redis.host=127.0.0.1 spring.redis.port=6379 ``` 3. 定义消息监听器 定义一个Redis消息监听器,用于接收订阅的消息。示例代码如下: ``` @Component public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { System.out.println("Received message: " + message.toString()); } } ``` 4. 发布消息 在需要发布消息的地方,注入RedisTemplate对象,调用convertAndSend方法即可发送消息。示例代码如下: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; public void sendMessage(String channel, String message) { redisTemplate.convertAndSend(channel, message); } ``` 5. 订阅消息 在启动类中定义Redis消息监听器容器,并将Redis消息监听器注册到容器中。示例代码如下: ``` @SpringBootApplication public class Application implements CommandLineRunner { @Autowired private RedisMessageListener redisMessageListener; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... args) throws Exception { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(redisConnectionFactory()); container.addMessageListener(redisMessageListener, new PatternTopic("test")); container.start(); } @Bean public JedisConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); config.setHostName("127.0.0.1"); config.setPort(6379); return new JedisConnectionFactory(config); } } ``` 以上代码中,容器使用Redis连接工厂创建,监听器注册到容器中,并使用PatternTopic定义订阅的消息通道。 这样,当有消息发布到指定通道时,RedisMessageListener的onMessage方法会被触发,从而实现Redis的实时推送功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值