Redis存儲Object 和 list

Redis 存儲支持的類型沒有object ,雖然有支持list,但是隻支持List

有兩種方法可以實現存儲對象和泛型

1.用序列化和反序列化

2.json


序列化工具類,實現序列化和反序列話對象和list集合

package com;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * 序列化工具類
 * @author caspar
 *
 */
public class SerializeUtil {

	/**
	 * 序列化
	 * @param object
	 * @return
	 */
	public static byte[] serialize(Object object) {
		if (object == null) {
			return null;
		}
		ObjectOutputStream oos = null;
		ByteArrayOutputStream baos = null;
		byte[] bytes = null;
		try {
			// 序列化
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			oos.writeObject(object);
			bytes = baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(oos);
			close(baos);
		}
		return bytes;
	}

	/**
	 * 反序列化
	 * 
	 * @param bytes
	 * @return
	 */
	public static Object unserialize(byte[] bytes) {
		if (bytes == null) {
			return null;
		}
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			// 反序列化
			bais = new ByteArrayInputStream(bytes);
			ois = new ObjectInputStream(bais);
			return ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(bais);
			close(ois);
		}
		return null;
	}

	/**
	 * 序列化 list 集合
	 * 
	 * @param list
	 * @return
	 */
	public static byte[] serializeList(List<?> list) {

		if (CommonUtil.isEmptyList(list)) {
			return null;
		}
		ObjectOutputStream oos = null;
		ByteArrayOutputStream baos = null;
		byte[] bytes = null;
		try {
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			for (Object obj : list) {
				oos.writeObject(obj);
			}
			bytes = baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(oos);
			close(baos);
		}
		return bytes;
	}

	/**
	 * 反序列化 list 集合
	 * 
	 * @param lb
	 * @return
	 */
	public static List<?> unserializeList(byte[] bytes) {
		if (bytes == null) {
			return null;
		}

		List<Object> list = new ArrayList<Object>();
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			// 反序列化
			bais = new ByteArrayInputStream(bytes);
			ois = new ObjectInputStream(bais);
			while (bais.available() > 0) {
				Object obj = (Object) ois.readObject();
				if (obj == null) {
					break;
				}
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(bais);
			close(ois);
		}
		return list;
	}

	/**
	 * 關閉io流對象
	 * 
	 * @param closeable
	 */
	public static void close(Closeable closeable) {
		if (closeable != null) {
			try {
				closeable.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

redis工具類的部分方法,實現設置/獲取對象和泛型值

 /**
     * 設置對象
     * @param key
     * @param obj
     */
    public static void setObject(String key ,Object obj){
    	try {
    		obj = obj == null ? new Object():obj;
    		getJedis().set(key.getBytes(), SerializeUtil.serialize(obj));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
    /**
     * 獲取對象
     * @param key
     * @return Object
     */
	public static Object getObject(String key){
		if(getJedis() == null || !getJedis().exists(key)){
			return null;
		}
		byte[] data = getJedis().get(key.getBytes());
		return (Object)SerializeUtil.unserialize(data);
	}
	
	/**
     * 設置List集合
     * @param key
     * @param list
     */
    public static void setList(String key ,List<?> list){
    	try {
    		
    		if(CommonUtil.isNotEmptyList(list)){
    			getJedis().set(key.getBytes(), SerializeUtil.serializeList(list));
    		}else{//如果list爲空,則設置一個空
    			getJedis().set(key.getBytes(), "".getBytes());
    		}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
    /**
     * 獲取List集合
     * @param key
     * @return
     */
	public static List<?> getList(String key){
		if(getJedis() == null || !getJedis().exists(key)){
			return null;
		}
		byte[] data = getJedis().get(key.getBytes());
		return SerializeUtil.unserializeList(data);
	}


測試main方法

public static void main(String[] args) {
    	//object
    	setObject("100",new Person("caspar",25));
    	
    	Person p = (Person)getObject("100");
    	System.out.println(p.getName()+"----"+p.getAge());
    	
    	//list
    	List<Person> list = new ArrayList<Person>();
    	list.add(new Person("唐馬儒",39));
    	list.add(new Person("大便熊",33));
    	list.add(new Person("小蘿莉",14));
    	
    	setList("list001", list);
    	List<Person> resultList = (List<Person>) getList("list001");
    	for (Person person : resultList) {
			System.out.println(person.getName()+"----"+person.getAge());
		}
	}

輸出結果

caspar----25
唐馬儒----39
大便熊----33
小蘿莉----14


正常情況下效率也挺高,但是如果再高併發的情況下,序列化和反序列化消耗太多,redis不支持存儲object和泛型,是有理由的。

建議使用json來存儲

把object和list<?> 轉成json的字符串格式再set到redis裏面,取得時候再把json轉換爲需要的對象,這樣簡單快捷,推薦使用





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章