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

时间:2023-01-11 14:34:40

原文链接:http://blog.csdn.net/ado1986/article/details/39052965?utm_source=tuicool&utm_medium=referral


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

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

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

    实体类:

[java] view plain copy jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
  1. public class Bean implements Serializable {//需要实现序列化接口  
  2.     private String name;  
  3.   
  4.     public String getName() {  
  5.         return name;  
  6.     }  
  7.   
  8.     public void setName(String name) {  
  9.         this.name = name;  
  10.     }  
  11. }  

    publish类:

[java] view plain copy jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
  1. public class TestPub {  
  2.     public static void main(String[] args) {  
  3.         Jedis jedis = new Jedis("127.0.0.1");  
  4.         try {  
  5.             Bean bean = new Bean();  
  6.             bean.setName("test");  
  7.                         //使用ObjectOutputStream和ByteArrayOutputStream将对象转换成字节流  
  8.             ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  9.             ObjectOutputStream oos = new ObjectOutputStream(baos);  
  10.             oos.writeObject(bean);  
  11.             String msg1 = baos.toString("ISO-8859-1");//指定字符集将字节流解码成字符串,否则在订阅时,转换会有问题。  
  12.             // msg1 = URLEncoder.encode(msg1, "UTF-8");  
  13.             jedis.publish("foo", msg1);  
  14.         } catch (Exception e) {  
  15.   
  16.         }  
  17.     }  
  18. }  

    subscribe类:

[java] view plain copy jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
  1. public class TestSub {  
  2.     public static void main(String[] args) {  
  3.         Jedis jedis = new Jedis("127.0.0.1");  
  4.         JedisPubSub jedisPubSub = new JedisPubSub() {  
  5.             @Override  
  6.             public void onUnsubscribe(String channel, int subscribedChannels) {  
  7.             }  
  8.   
  9.             @Override  
  10.             public void onSubscribe(String channel, int subscribedChannels) {  
  11.             }  
  12.   
  13.             @Override  
  14.             public void onPUnsubscribe(String pattern, int subscribedChannels) {  
  15.             }  
  16.   
  17.             @Override  
  18.             public void onPSubscribe(String pattern, int subscribedChannels) {  
  19.             }  
  20.   
  21.             @Override  
  22.             public void onPMessage(String pattern, String channel,  
  23.                     String message) {  
  24.             }  
  25.   
  26.             @Override  
  27.             public void onMessage(String channel, String message) {  
  28.                 try {  
  29.                     ByteArrayInputStream bis = new ByteArrayInputStream(  
  30.                             message.getBytes("ISO-8859-1"));//此处指定字符集将字符串编码成字节数组,此处的字符集需要与发布时的字符集保持一致  
  31.                     ObjectInputStream ois = new ObjectInputStream(bis);  
  32.                     Bean bean = (Bean) ois.readObject();  
  33.                     System.out.println(bean.getName());  
  34.                 } catch (Exception e) {  
  35.                     e.printStackTrace();  
  36.                 } finally {  
  37.   
  38.                 }  
  39.             }  
  40.         };  
  41.         jedis.subscribe(jedisPubSub, "foo");  
  42.     }  
  43. }