redis访问 - rewin.ubsi.common.JedisUtil


检测redis是否可用

public static boolean isInited();

参数:

返回:

  • 当前是否已经正常连接到了redis server

获取一个Jedis实例

public static Jedis getJedis();

参数:

返回:

  • redis.clients.jedis.Jedis对象,后续可以使用这个对象访问redis;如果失败会抛出异常

注意:

  • Jedis对象使用结束后,需要主动调用close()以释放资源,或者使用 try-with-resource 机制
  • 如果操作中会切换redis的Database,需要在完成操作后切换回 JedisUtil.DATABASE

示例:

try (Jedis jedis = JedisUtil.getJedis()) {
    //do your work
    jedis.select(JedisUtil.DATABASE);    // 如果之前执行过select操作
}

发送一个广播消息

public static void publish(String channel, Object data);

参数:

  • channel - 广播频道
  • data - 消息数据

返回:

注意:

  • 所有"订阅"了该频道的"监听器"都会收到这个广播

发送一个事件

public static void putEvent(String channel, Object data);

参数:

  • channel - 事件频道
  • data - 事件数据

返回:

注意:

  • 在分布式环境下,即便存在多个订阅了该频道的监听器,但只有一个能收到这个事件(抢占式处理)

频道监听器 - JedisUtil.Listener

    public static abstract class Listener {

        /** 广播监听的回调入口 */
        public abstract void onMessage(String channel, Object message) throws Exception;

        /** 事件监听的回调入口 */
        public abstract void onEvent(String channel, Object event) throws Exception;

        /** 监听广播频道 */
        public void subscribe(String... channels);

        /** 监听广播频道("*"表示通配符) */
        public void subscribePattern(String... patterns);

        /** 监听事件频道(在一个Java进程中,同一个事件频道只能存在一个监听器) */
        public void subscribeEvent(String... channels) throws Exception;

        /** 取消广播监听 */
        public void unsubscribe(String... channels);

        /** 取消广播监听 */
        public void unsubscribePattern(String... patterns);

        /** 取消事件监听 */
        public void unsubscribeEvent(String... channels);

    }

注意:

  • 如果使用JedisUtil.publish()发布广播或者JedisUtil.putEvent()发送"事件",必须使用JedisUtil.Listener来监听
  • 发送的广播或者事件数据可以是任意数据类型,但是在监听器接收时,会转换为UBSI基础数据类型
  • 在回调接口onMessage或onEvent中,如果需要进行高耗时的操作,应启动另外的任务线程进行处理,以免阻塞异步I/O

示例:

    if ( JedisUtil.isInited() ) {
        // 创建频道监听器
        JedisUtil.Listener listener = new JedisUtil.Listener() {
            @Override
            public void onMessage(String channel, Object message) {
                System.out.print("\n~~~ receive message from [" + channel + "]: ");
                Request.printJson(message);
            }

            @Override
            public void onEvent(String channel, Object event) {
                System.out.print("\n~~~ receive event from [" + channel + "]: ");
                Request.printJson(event);
            }
        }

        listener.subscribe("msg1", "msg2");         // 监听广播频道
        listener.subscribeEvent("evt1", "evt2");    // 监听事件频道
    }

results matching ""

    No results matching ""