redis现在比较长用做缓存服务器,nosql数据库,同时它还具有实现消息的发布订阅的功能。本篇文章将会实现一个用redis实现发布订阅功能的一个demo


首先用一个实体对象

package com.wtf.demo.redis;
import java.io.Serializable;

public class UserBean implements Serializable {
   private String username;
   private String address;

   public String getUsername() {
      return username;
   }
   public void setUsername(String username) {
      this.username = username;
   }
   public String getAddress() {
      return address;
   }
   public void setAddress(String address) {
      this.address = address;
   }
}

我们会发布这个对象,当这个对象,并且可以更改这个对象 的属性,发布的代码 如下

package com.wtf.demo.redis;

import redis.clients.jedis.Jedis;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class TestPub {

   public static void main(String[] args) throws IOException {
      // TODO Auto-generated method stub
      Jedis jedis = new Jedis("127.0.0.1",6379);
      UserBean ub = new UserBean();
      ub.setUsername("张三");
      ub.setAddress("上海市");
      ByteArrayOutputStream os = new ByteArrayOutputStream(); 
      ObjectOutputStream op = new ObjectOutputStream(os);
      op.writeObject(ub);
      String msg1 = os.toString("ISO-8859-1");
      jedis.publish("ub", msg1);
   }
}


发布完成以后,我们建立一个订阅的类,以上发布了ub这个对象,在订阅类中,我们需要JedisPubSub这个对象,并且实现里面的相关方法。

package com.wtf.demo.redis;

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

import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;

public class TestSub {

        public static void main(String[] args) {
          Jedis jedis = new Jedis("uat.www.nanapanda.cn",6379);
          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);
                UserBean bean = (UserBean) ois.readObject();
                System.out.println(bean.getUsername());
                System.out.println(bean.getAddress());
              } catch (Exception e) {
                e.printStackTrace();
              } finally {

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

}


这样在运行 了TestPub类以后,再运行TestSub类,将会有如下输出

--------------------

张三
上海市

在TestPub中更改UserBean 的属性,把地址更改为北京,在订阅窗口将会得到如下值

------------------

张三

北京