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操作,会报异常。
分享到:
相关推荐
Java实现Redis的消息订阅和发布实例。
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— ...
C# Redis 操作实例 包括 string set sortset list sortlist hyperlog 订阅等实例代码,读写分离 负载均衡设置
主要介绍了nodejs redis 发布订阅机制封装的相关资料,这里提供了实现方法,及实例代码,具有参考价值,需要的朋友可以参考下
主要介绍了Spring boot+redis实现消息发布与订阅,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值需要的朋友可以参考下
redis在C#中的实例,代码完整可用,如需安装redis请参考我的笔记http://download.csdn.net/download/u012149906/10135771
消息队列:Redis支持发布/订阅模式,可用于事件驱动架构,实现异步消息传递。 缺点 复杂性:引入Redis增加了系统的复杂性,需要考虑数据一致性、部署维护等问题。 成本:部署和维护Redis需要额外的成本和资源。 无...
主要介绍了Python redis操作,结合实例形式分析了Python redis的连接、管道、发布和订阅等相关概念、原理及操作技巧,需要的朋友可以参考下
在Delphi环境下使用Redis,支持发布订阅等,在常用的delphi开发环境下都能编译通过,本实例在Delphi7环境下编译通过
可以通过PubSub类的实例来订阅频道,并接收发布的消息。 5. Transaction类:表示事务操作,可以将一系列操作封装在一个事务中,保证这些操作的原子性。可以通过Transaction类的实例来执行事务操作。 除了以上类,...
第 1 章Redis 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
发布订阅 分布式 这里我们通过几个场景,不同维度说下Redis的应用。 高性能适合当做缓存 缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcache
RedisSyncer是一个redis多任务同步工具集,应用于redis单实例及集群同步。 该工具集包括: redis 同步服务引擎 redissyncer-server redissycner 客户端 redissyncer-cli dashboard web控制面板 redissycner-...
用于ShareDB的Redis发布/订阅适配器适配器。 这个ShareDB附加组件为您提供水平可伸缩性。 具有多个服务器节点而不是单个服务器的集群的能力。 使用此适配器,客户端可以连接到群集中的任何计算机,并且他们提交的...
Rsyslog omprog插件,用于传播python实例的消息日志。 Rsylog(操作)> Python(readlines)> Redis(pubsub通道) 依存关系 Nome Versão Python 3.7 python3-pip 19.1.1-8 python3-virtualenv 16.6.2-1 ...
本文实例讲述了python实现与redis交互操作。分享给大家供大家参考,具体如下: 相关内容: redis模块的使用 安装模块 导入模块 连接方式 连接池 操作 设置值 获取值 管道 事务 订阅\发布 首发时间:...
第 1 章Redis 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...