【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));
}
}