Redis Pub/Sub 使用

作者:Rui 发布时间:June 12, 2016 分类:JAVA,Redis,BIGDATA 浏览:970

Redis 提供消息发布订阅的功能,区别于我们经常使用消息服务,Redis是将消息发布到指定的channel,而无需关心有多少订阅者,订阅者只需要订阅关心的一个或者多个channel即可,只接受关心的数据,而不用关心消息的发布者。解耦消息发布者和订阅者,为应用带了更好的灵活性和可扩展性。

例如:如果我们想要订阅某一频道的消息,可以使用以下命令:

SUBSCRIBE channel1 channel2

其他redis客户端发布到channel1,channel2的消息,就会被redis推送所有的订阅的客户端

消息数据库和范围
Redis 消息与key space是没有关系的。redis消息订阅发布不会受Redis 数据库的影响。
例如:一个客户端将消息发布到redis的数据库10,在数据库1注册的订阅者也可以接收到数据库10的消息
如果你想要控制消息的范围,可以将channel的前缀定义为不同的字符,例如测试和生产环境分别用test 和production

模式匹配订阅
Redis可以依据模式匹配来订阅消息。

PSUBSCRIBE test.* 

接受所有以test.开头的channel的消息,例如:test.china, test.usa
注意: 如果同时使用普通订阅和模式匹配订阅同一个channel,客户端会接受到两个消息,一个是正常的消息,一个是pmessage。

Redis订阅发布缺点

  1. Redis Pub/Sub 并不是特别可靠地消息中间件,Redis并不会存储消息,也就是说,当客户端断开期间,如果其他客户端发布消息,那么断开的客户端即使重新连接后,也不能够得到这些消息。所以Redis Pub/Sub 并不适用于可靠性要求比较高的系统。
  2. 另外Redis Pub/Sub发布的消息格式只能为string类型。

Java订阅示例

JedisShardInfoshardInfo=newJedisShardInfo("kevincache.redis.cache.chinacloudapi.cn",6379);
Jedisjedis=newJedis(shardInfo);
jedis.subscribe(newJedisPubSub(){
    @Override
    publicvoidonMessage(Stringchannel,Stringmessage){
        super.onMessage(channel,message);
        System.out.println("recevideamessagefrom["+channel+"]:"+message);
    }
},"first");
jedis.close();

标签: none

添加新评论 »