jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换

转载 2016年08月30日 17:17:08

redis支持发布/订阅的消息队列机制,jedis提供了java访问redis的客户端,本文将描述如何用jedis实现简单的消息队列,并传输对象。

redis支持发布、订阅的功能,基本的命令有publish、subscribe等。在jedis中,有对应的java方法,并且只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处理。将对象序列化后,只能成为字节流,如何封装成字符串是一个难点,具体可参考下面的代码。

实现三个类,一个对应publish、一个对应subscribe、一个对应要传递的对象实体类。

实体类:

public class Bean implements Serializable {//需要实现序列化接口
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

publish类:

public class TestPub {
  public static void main(String[] args) {
    Jedis jedis = new Jedis("127.0.0.1");
    try {
      Bean bean = new Bean();
      bean.setName("test");
  //使用ObjectOutputStream和ByteArrayOutputStream将对象转换成字节流
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(bean);
      String msg1 = baos.toString("ISO-8859-1");//指定字符集将字节流解码成字符串,否则在订阅时,转换会有问题。
      // msg1 = URLEncoder.encode(msg1, "UTF-8");
      jedis.publish("foo", msg1);
    } catch (Exception e) {

    }
  }
}

subscribe类:

public class TestSub {
  public static void main(String[] args) {
    Jedis jedis = new Jedis("127.0.0.1");
    JedisPubSub jedisPubSub = new JedisPubSub() {
      @Override
      public void onUnsubscribe(String channel, int subscribedChannels) {
      }

      @Override
      public void onSubscribe(String channel, int subscribedChannels) {
      }

      @Override
      public void onPUnsubscribe(String pattern, int subscribedChannels) {
      }

      @Override
      public void onPSubscribe(String pattern, int subscribedChannels) {
      }

      @Override
      public void onPMessage(String pattern, String channel,
          String message) {
      }

      @Override
      public void onMessage(String channel, String message) {
        try {
          ByteArrayInputStream bis = new ByteArrayInputStream(
              message.getBytes("ISO-8859-1"));//此处指定字符集将字符串编码成字节数组,此处的字符集需要与发布时的字符集保持一致
          ObjectInputStream ois = new ObjectInputStream(bis);
          Bean bean = (Bean) ois.readObject();
          System.out.println(bean.getName());
        } catch (Exception e) {
          e.printStackTrace();
        } finally {

        }
      }
    };
    jedis.subscribe(jedisPubSub, "foo");
  }
}



jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换

redis支持发布、订阅的功能,基本的命令有publish、subscribe等。在jedis中,有对应的java方法,并且只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处...
  • duwenchao1986
  • duwenchao1986
  • 2014年09月04日 15:31
  • 7769

使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)

前言: 本文基于jedis 2.9.0.jar、commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis连接池需要依赖commons-pool2包,js...
  • eguid_1
  • eguid_1
  • 2016年09月20日 22:08
  • 15824

基于Redis实现分布式消息队列(4)

纯代码干货:访问Redis的工具类;队列接口;队列的Redis实现类;获取队列实例的工具类;向队列中添加任务的代码;从队列中取出任务执行的代码。...
  • stationxp
  • stationxp
  • 2015年05月15日 01:31
  • 9022

jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换

原文链接:http://blog.csdn.net/ado1986/article/details/39052965?utm_source=tuicool&utm_medium=referral ...
  • liuxiangke0210
  • liuxiangke0210
  • 2017年04月05日 15:28
  • 357

jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换

redis支持发布、订阅的功能,基本的命令有publish、subscribe等。在jedis中,有对应的java方法,并且只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处...
  • duwenchao1986
  • duwenchao1986
  • 2014年09月04日 15:31
  • 7769

java redis使用之利用jedis实现redis消息队列

应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高、连接频繁的因素,决定利用缓存做。 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可...
  • jiuhanfengganlin
  • jiuhanfengganlin
  • 2016年03月03日 17:10
  • 13403

java redis使用之利用jedis实现redis消息队列

应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高、连接频繁的因素,决定利用缓存做。 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可...
  • LanSeTianKong12
  • LanSeTianKong12
  • 2016年08月30日 14:14
  • 741

java redis使用之利用jedis实现redis消息队列

应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高、连接频繁的因素,决定利用缓存做。 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可...
  • u014756827
  • u014756827
  • 2016年08月02日 11:11
  • 290

java redis使用之利用jedis实现redis消息队列

http://www.2cto.com/kf/201505/403602.html 应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高、连接频繁的因素,决定...
  • qiezikuaichuan
  • qiezikuaichuan
  • 2015年09月14日 18:06
  • 577

java redis使用之利用jedis实现redis消息队列

应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高、连接频繁的因素,决定利用缓存做。 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可...
  • younger_z
  • younger_z
  • 2017年03月16日 21:45
  • 408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
举报原因:
原因补充:

(最多只允许输入30个字)