jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
2016-08-30 17:17
841 查看
redis支持发布/订阅的消息队列机制,jedis提供了java访问redis的客户端,本文将描述如何用jedis实现简单的消息队列,并传输对象。
redis支持发布、订阅的功能,基本的命令有publish、subscribe等。在jedis中,有对应的java方法,并且只能发布字符串消息。为了传输对象,需要将对象进行序列化,并封装成字符串进行处理。将对象序列化后,只能成为字节流,如何封装成字符串是一个难点,具体可参考下面的代码。
实现三个类,一个对应publish、一个对应subscribe、一个对应要传递的对象实体类。
实体类:
publish类:
subscribe类:
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的消息队列、发布对象消息、字节数组与字符串相互转换
- jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
- 使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)
- Android使用Google Gson实现JSON字符串和对象、对象数组之间相互转换
- php中循环实现(字符串,对象,或者数组)编码相互转换
- 需要这样一个记录本-7 C#字符串与字节数组相互转换
- C#实现字符串转换成字节数组的简单实现方法
- 字节、字符串、字节数组之间的相互转换
- Android学习之Bitmap对象与字节数组相互转换
- 利用Google Gson实现JSON字符串和对象之间相互转换
- js实现字符串和数组之间相互转换操作
- java redis使用之利用jedis实现redis消息队列
- java中对象与字节数组相互转换
- 字节数组和字符串相互转换
- java中对象与字节数组相互转换
- Google Gson实现JSON字符串和对象之间相互转换
- java redis使用之利用jedis实现redis消息队列
- 【Redis】jedis客户端实现redis消息的发布订阅(实时消息中间件)
- C# 字符串与字节数组相互转换
- 加密解密基础问题:字节数组和(16进制)字符串的相互转换(转)