package com.redis.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPubSubTest {
public static JedisPool pool;
static {
JedisPoolConfig jedispool_config = new JedisPoolConfig();
jedispool_config.maxActive = 20;
jedispool_config.maxIdle = 0;
jedispool_config.maxWait = 1000;
jedispool_config.testOnBorrow = true;
pool = new JedisPool(jedispool_config, "127.0.0.1", 6379);
}
public static void main(String[] args) throws InterruptedException {
Jedis redisClient1 = pool.getResource();
Jedis redisClient2 = pool.getResource();
MyListener listener = new MyListener();
Publisher pub = new Publisher();
pub.publish(redisClient2); //发布一个频道
Subscriber sub = new Subscriber();
sub.psub(redisClient1, listener); // 订阅一个频道
}
}
class Subscriber {
public void psub(final Jedis redisClient, final MyListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("订阅:news.share");
// 订阅得到信息在lister的onMessage(...)方法中进行处理
// 订阅多个频道
// redisClient.subscribe(listener, "news.share", "news.log");
//redisClient.subscribe(listener, new String[]{"news.share","news.log"});
redisClient.psubscribe(listener, new String[] { "news.share" });// 使用模式匹配的方式设置频道
}
}).start();
}
}
class Publisher {
public void publish(final Jedis redisClient) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发布:news.share");
redisClient.publish("news.share", "ok");
redisClient.publish("news.share", "hello word");
}
}).start();
}
}
消息监听:
package com.redis.test;
import redis.clients.jedis.JedisPubSub;
public class MyListener extends JedisPubSub {
// 取得订阅的消息后的处理
public void onMessage(String channel, String message) {
System.out.println(channel + "=" + message);
}
// 初始化订阅时候的处理
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println(channel + "=" + subscribedChannels+"&&&&&&&");
}
// 取消订阅时候的处理
public void onUnsubscribe(String channel, int subscribedChannels) {
System.out.println(channel + "=" + subscribedChannels+"#########");
}
// 初始化按表达式的方式订阅时候的处理
public void onPSubscribe(String pattern, int subscribedChannels) {
System.out.println(pattern + "=" + subscribedChannels+"!!!!!!!");
}
// 取消按表达式的方式订阅时候的处理
public void onPUnsubscribe(String pattern, int subscribedChannels) {
System.out.println(pattern + "=" + subscribedChannels+"@@@@@@@@@");
}
// 取得按表达式的方式订阅的消息后的处理
public void onPMessage(String pattern, String channel, String message) {
System.out.println(pattern + "=" + channel + "=" + message);
}
}
结论: 经测试 sub 必须发pub 之前,否则收不到 message, 不要 pool.returnResource操作,会报异常。
分享到:
相关推荐
接着,我们可以通过`GetSubscriber`方法获取到`ISubscriber`实例,用于订阅和发布消息: ```csharp var subscriber = redis.GetSubscriber(); ``` 对于发布者(Publisher)来说,使用`Publish`方法可以向指定频道...
在Java代码中,我们创建`Jedis`实例连接到Redis服务器,然后可以使用`publish`方法发布消息,`subscribe`方法订阅频道。以下是一个简单的示例: ```java import redis.clients.jedis.Jedis; import redis.clients....
本篇文章将深入探讨如何使用Java来实现Redis的消息订阅和发布功能,这在分布式系统和实时数据处理中非常关键。 首先,理解Redis的发布/订阅(Pub/Sub)模式是至关重要的。在这一模式下,Redis服务器作为消息的中间...
在 Redis 中,订阅与发布(Pub/Sub)是一种消息通信模式,用于实现实时的消息传递。在这个模式下,发布者将消息发送到特定的频道,而订阅者则可以监听并接收这些频道上的消息。这种机制无需直接交互,而是通过中间的...
在.NET环境中,我们可以利用StackExchange.Redis库来实现对Redis的各种操作,包括发布订阅(Publish/Subscribe)功能。发布订阅是一种通信模式,允许消息发送者(Publisher)向多个消息接收者(Subscriber)广播消息...
通过以上步骤,你将能够利用Qt和hiredis实现完整的Redis订阅发布功能。这将使你的应用程序能够与其他使用相同Redis频道的客户端进行实时通信,极大地扩展了Qt应用的可能性。记得在实际项目中进行充分的测试和优化,...
使用StackExchange.Redis进行发布订阅,首先需要建立与Redis服务器的连接。可以通过`ConnectionMultiplexer`类创建连接,并通过其`Connect`方法获取连接实例: ```csharp using (var redis = ConnectionMultiplexer....
在Delphi7这个经典的面向对象编程环境中,可以利用第三方库或者自定义组件来实现Redis的客户端连接,以实现发布/订阅等功能。 在这个项目中,我们可以看到几个关键文件: 1. RedisClient.cfg 和 NsyRedis.cfg:...
本教程将详细讲解Redis的安装过程和Java开发中的实际应用实例。 一、Redis安装 1. 下载Redis:首先,你需要从官方网站(https://redis.io/download)获取Redis的最新稳定版本。根据你的操作系统(如Windows、Linux...
8. **消息队列实现**:通过Redis的发布/订阅功能,LabVIEW可以实现异步通信,比如在不同模块之间传递消息。 9. **LabVIEW与外部系统集成**:这个实例可能是展示如何将LabVIEW系统与其他依赖Redis的系统(如Web服务...
Redis还提供了消息发布/订阅功能,允许不同客户端间通信: ```java // 发布者 jedis.publish("channel", "message"); // 订阅者 JedisPubSub subscriber = new JedisPubSub() { @Override public void ...
这个例子展示了如何使用Java通过Jedis与Redis进行交互,实现实时的消息发布和订阅。在实际应用中,你可以根据需求对代码进行扩展,例如支持多通道订阅,处理更复杂的消息格式,或者使用连接池管理Jedis实例以提高...
在Redis中,发布/订阅(Publish/Subscribe,简称Pub/Sub)是一种消息通信模式,它允许消息生产者(发布者)发送消息到一个频道,而多个消息消费者(订阅者)可以实时接收这些消息。这个功能在分布式系统中尤其有用,...
1. **Redis消息订阅与发布** Redis的发布/订阅(Pub/Sub)模式是一种轻量级的消息通信机制。发布者将消息发送到一个频道,订阅者可以监听并接收这些频道上的消息。这种模式不保证消息的可靠传递,适合对实时性要求...
以下是一些关于Redis订阅者的关键知识点: 1. **Jedis库**: Java开发者通常使用Jedis这个开源库来与Redis服务器交互。Jedis提供了丰富的API,包括发布和订阅功能。 2. **订阅者接口**: 在Jedis中,`JedisPubSub`是...
Redis还支持发布和订阅功能,可以创建频道并发送消息: ```csharp var pubSub = redis.GetSubscriber(); pubSub.Publish("channelName", "message"); ``` 并通过`Subscribe`方法接收消息: ```csharp pubSub...
在本项目中,Redis可能被用来存储热点数据,提高读取速度,或者作为消息队列的辅助工具,如发布/订阅模式,提高系统的实时性。 5. **RabbitMQ**: RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)的消息...
在本文中,我们将深入探讨如何使用Spring Boot和Redis来实现消息发布与订阅功能。Spring Boot以其简化Spring应用程序的初始化和配置而闻名,而Redis则是一个高效、轻量级的内存数据结构存储,常用于实现缓存、消息...
8. **扩展功能**:Redis不仅支持基础数据类型,还提供了发布/订阅、事务、lua脚本等功能,可以根据实际需求灵活使用。 通过这个实例,开发者可以深入理解如何在Spring应用中集成Redis,并掌握相关配置和操作,提升...
- **发布订阅(Pub/Sub)**:实现消息传递,客户端可以订阅特定频道,服务器向频道发布消息时,订阅者将收到通知。 - **分布式锁**:使用`SETNX`或`SETEX`配合超时机制,实现跨节点的锁服务,常用于并发控制。 4....