java 实现redis消息队列

598 阅读2分钟
原文链接: www.mayou18.com

【redis】java 实现redis消息队列

2017年4月14日 18:18:08 Redis & redis学习 作者 :书生

设计思路

 redis 可以对所有的内容进行二进制的存储,我们将对象通过 java序列化 btye[] 二进制存储到 reids缓存数据库中。利用redis中lpush(rpop)或rpush(lpop) 来实现FIFO 先进先出队列。


序列化方法

需求描述:对象转换成byte[],和根据byte[]数组反序列化成java对象。

主要使用api:

ByteArrayOutputStream:可以捕获内存缓冲区的数据,转换成字节数组。

ByteArrayInputStream:从内存中的字节数组中读取数据,因此它的数据源是一个字节数组。这个类的构造方法包括: 
                                   ByteArrayInputStream(byte[] buf)--------参数buf指定字节数组类型的数据源。 
                                   ByteArrayInputStream(byte[] buf, int offset, int lenght)-----参数buf指定字节数组类型数据源,参数offset指定从数组中开始读取数据的起始下标位置,lenght指定从数组中读取的字节数。


注意事项:序列化的对象都要实现Serializable接口


代码例子:

package com.bean.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectUtil {
	/**对象转byte[]
	 * @param obj
	 * @return
	 * @throws IOException
	 */
	public static byte[] objectToBytes(Object obj) throws Exception{
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(obj);
		byte[] bytes = bo.toByteArray();
		bo.close();
		oo.close();
		return bytes;
	}
	/**byte[]转对象
	 * @param bytes
	 * @return
	 * @throws Exception
	 */
	public static Object bytesToObject(byte[] bytes) throws Exception{
		ByteArrayInputStream in = new ByteArrayInputStream(bytes);
		ObjectInputStream sIn = new ObjectInputStream(in);
		return sIn.readObject();
	}
}

队列伪代码:

package com.quene.test;

import com.bean.Message;
import com.bean.util.ObjectUtil;
import com.redis.util.JedisUtil;

public class TestRedisQuene {
	public static byte[] redisKey = "key".getBytes();
	static{
		init();
	}
	public static void main(String[] args) {
		pop();
	}

	private static void pop() {
		byte[] bytes = JedisUtil.rpop(redisKey);
		Message msg = (Message) ObjectUtil.bytesToObject(bytes);
		if(msg != null){
			System.out.println(msg.getId()+"   "+msg.getContent());
		}
	}

	private static void init() {
		Message msg1 = new Message(1, "内容1");
		JedisUtil.lpush(redisKey, ObjectUtil.objectToBytes(msg1));
		Message msg2 = new Message(2, "内容2");
		JedisUtil.lpush(redisKey, ObjectUtil.objectToBytes(msg2));
		Message msg3 = new Message(3, "内容3");
		JedisUtil.lpush(redisKey, ObjectUtil.objectToBytes(msg3));
	}

}