Redis Pubsub命令用法

一.什么是pub/sub及实现
Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。

Redis通过publish和subscribe命令实现订阅和发布的功能。

订阅者通过subscribe向redis server订阅自己感兴趣的消息类型。redis将信息类型称为通道(channel)。
当发布者通过publish命令向redis server发送特定类型的信息时,订阅该消息类型的全部订阅者都会收到此消息。

客户端1订阅CCTV1:

127.0.0.1:6379> subscribe CCTV1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV1"
3) (integer) 1

客户端2订阅CCTV1和CCTV2:

127.0.0.1:6379> subscribe CCTV1 CCTV2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV1"
3) (integer) 1
1) "subscribe"
2) "CCTV2"
3) (integer) 2

此时这两个客户端分别监听指定的频道。现在另一个客户端向服务器推送了这两个频道的信息。

127.0.0.1:6379> publish CCTV1 "cctv1 is good"
(integer) 2 //返回2表示两个客户端接收了该消息。

被接收到消息的客户端如下所示。
客户端1:

1) "message"
2) "CCTV1"
3) "cctv1 is good"

客户端2:

1) "message"
2) "CCTV1"
3) "cctv1 is good"

如上的订阅/发布也称订阅发布到频道(使用publish与subscribe命令),此外还有订阅发布到模式(使用psubscribe来订阅一个模式)

订阅CCTV的全部频道

127.0.0.1:6379> psubscribe CCTV*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "CCTV*"
3) (integer) 1

当依然先如上推送一个CCTV1的消息时,该客户端正常接收。

二、Pub/Sub在Java中的实现
导入Redis驱动:

dependencies {
compile ‘redis.clients:jedis:2.4.2‘
}

Redis驱动包提供了一个抽象类:JedisPubSub…继承这个类就完成了对客户端对订阅的监听。示例代码:

package com.ljq.durian.test;

import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

/**
 * 客户端订阅监听类
 *
 * @author jqlin
 *
 */
public class PubSubService extends JedisPubSub {
    private static final Logger logger = Logger.getLogger(PubSubService.class);

    /**
     * 监听到订阅频道接收到消息
     */
    @Override
    public void onMessage(String channel, String message) {
        logger.info(String.format("onSubscribe: channel[%s], " + "message[%s]", channel, message));
    }

    /**
     * 监听到订阅模式接收到消息
     */
    @Override
    public void onPMessage(String pattern, String channel, String message) {
        logger.info(String.format("onPMessage: pattern[%s], channel[%s], message[%s]", pattern, channel, message));
    }

    /**
     * 订阅频道时的回调
     *
     */
    @Override
    public void onSubscribe(String channel, int subscribedChannels) {
        logger.info(String.format("onSubscribe: channel[%s], " + "subscribedChannels[%s]", channel, subscribedChannels));
    }

    /**
     * 取消订阅频道时的回调
     */
    @Override
    public void onUnsubscribe(String channel, int subscribedChannels) {
        logger.info(String.format("onUnsubscribe: channel[%s], " + "subscribedChannels[%s]", channel, subscribedChannels));
    }

    /**
     * 取消订阅模式时的回调
     */
    @Override
    public void onPUnsubscribe(String pattern, int subscribedChannels) {
        logger.info(String.format("onPUnsubscribe: pattern[%s], " + "subscribedChannels[%s]", pattern, subscribedChannels));
    }

    /**
     * 订阅频道模式时的回调
     */
    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        logger.info(String.format("onPSubscribe: pattern[%s], " + "subscribedChannels[%s]", pattern, subscribedChannels));
    }

    public static void main(String[] args) {
        Jedis jedis = null;
        try {
            jedis = new Jedis("127.0.0.1", 6379, 0);// redis服务地址和端口号
            PubSubService pubSub = new PubSubService();
            jedis.subscribe(pubSub, "news.share", "news.blog");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.disconnect();
            }
        }
    }
}

从代码中我们不难看出,我们声明的一个redis链接在设置监听后就可以执行一些操作,例如发布消息,订阅消息等。。。

当运行上述代码后会在控制台输出:

onSubscribe: channel[news.share],subscribedChannels[1]
onSubscribe: channel[news.blog],subscribedChannels[2]
//onSubscribe方法成功运行

此时当在有客户端向new.share或者new.blog通道publish消息时,onMessage方法即可被相应。(jedis.publish(channel, message))。

时间: 2024-10-03 23:00:18

Redis Pubsub命令用法的相关文章

redis sort命令用法

1.命令描述返回或保存给定列表.集合.有序集合key中经过排序的元素.排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较. 2.一般sort用法最简单的sort使用方法是sort key和sort key desc.sort key:返回键值从小到大排序的结果.sort key desc:返回键值从大到小排序的结果. 假设price列表保存了今日的物品价格, 那么可以用sort命令对它进行排序:# 开销金额列表redis> lpush price 30 1.5 10 8(integer

Redis学习笔记之五:redis keys命令 (24个)

Redis 版本:3.2.100 Redis 命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端. 一.客户端连接服务器 基本语法: redis-cli [-h host -p port -a password] 不带参数,则默认连接本地,带上三个参数,则连接远程服务器. 举例: 如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上. redis-cli -h 127.0.0.

Java操作Redis之Jedis用法详解

Redis(Remote Dictionary Server,远程数据字典服务器)是一个开源的高性能内存数据库,常用作缓存缓存服务器使用,也已做消息队列使用.因其高性能.丰富的数据类型.可扩展等特性受开发者青睐,这里介绍在java中使用Jedis操作Redis的基本用法. 1. 字符串String. package com.zws.redis.examples; import java.util.concurrent.TimeUnit; import redis.clients.jedis.Je

自学总结redis第二部分(redis常用命令、高级命令特性以及与java代码的结合)

六.redis多数据类型介绍(常用命令) 6.1前提操作 #如果前面的redis环境没搭好,那么可以先暂时在 "http://try.redis.io/"中实践redis命令部分.   #为了测试方便,把redis登录密码暂时撤销   #redis一共分为五种基本数据类型:String,Hash,List,Set,ZSet #所有命令都可以到"http://www.redis.cn/commands.html"  去搜索到. #首先由于redis是一个基于key-v

redis 的命令总结

[Redis] redis-cli 命令总结 Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用. 在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法.下面将Redis提供的命令做一总结. 官网命令列表:http://redis.io/commands (英文) 1.连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 2.对value操作的命令 exists(key):确认

【命令】Redis常用命令整理

doc 环境下使用命令: keys 命令 ?    匹配一个字符 *    匹配任意个(包括0个)字符 []    匹配括号间的任一个字符,可以使用 "-" 符号表示一个范围,如 a[b-d] 可以匹配 "ab","ac","ad" \x    匹配字符x,用于转义符号,如果要匹配 "?" 就需要使用 \? 判断一个键值是否存在 exists key 如果存在,返回整数类型 1 ,否则返回 0 删除键 de

Redis Scan命令

原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUNT count] SCAN 命令及其相关的 SSCAN 命令. HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements): SCAN 命令用于迭代当前数据库中的数据库键. SSCAN 命令用于迭代集

数据库 【redis】 命令大全

以下纯属搬砖,我用Python抓取的redis命令列表页内容 如果想看命令的具体使用可查去官网查看,以下整理为个人查找方便而已 地理位置GEOADD 将指定的地理空间位置(纬度.经度.名称)添加到指定的key中GEODIST 返回两个给定位置之间的距离GEOHASH 返回一个或多个位置元素的 Geohash 表示GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)GEORADIUS 以给定的经纬度为中心, 找出某一半径内的元素GEORADIUSBYMEMBER 找出位于指定范围内的元

Redis常用命令及知识

1.    redis数据结构 – 简介 redis是一种高级的key:value存储系统,其中value支持五种数据类型: 1.字符串(strings) 2.字符串列表(lists) 3.字符串集合(sets) 4.有序字符串集合(sorted sets) 5.哈希(hashes) 而关于key,有几个点要提醒大家: 1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率: 2.key也不要太短,太短的话,key的可读性会降低: 3.在一个项目中,key最好使用统一