Redis存储Object 和 list<object>

来源:互联网 发布:医药b2b关键词 seo 编辑:程序博客网 时间:2024/05/21 12:41
Redis 存储支持的类型没有object ,虽然有支持list,但是只支持List<String>

有两种方法可以实现存储对象和泛型

1.用序列化和反序列化

2.json


序列化工具类,实现序列化和反序列话对象和list集合

[java] view plain copy
  1. package com;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.Closeable;  
  6. import java.io.ObjectInputStream;  
  7. import java.io.ObjectOutputStream;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10. /** 
  11.  * 序列化工具类 
  12.  * @author caspar 
  13.  * 
  14.  */  
  15. public class SerializeUtil {  
  16.   
  17.     /** 
  18.      * 序列化 
  19.      * @param object 
  20.      * @return 
  21.      */  
  22.     public static byte[] serialize(Object object) {  
  23.         if (object == null) {  
  24.             return null;  
  25.         }  
  26.         ObjectOutputStream oos = null;  
  27.         ByteArrayOutputStream baos = null;  
  28.         byte[] bytes = null;  
  29.         try {  
  30.             // 序列化  
  31.             baos = new ByteArrayOutputStream();  
  32.             oos = new ObjectOutputStream(baos);  
  33.             oos.writeObject(object);  
  34.             bytes = baos.toByteArray();  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.         } finally {  
  38.             close(oos);  
  39.             close(baos);  
  40.         }  
  41.         return bytes;  
  42.     }  
  43.   
  44.     /** 
  45.      * 反序列化 
  46.      *  
  47.      * @param bytes 
  48.      * @return 
  49.      */  
  50.     public static Object unserialize(byte[] bytes) {  
  51.         if (bytes == null) {  
  52.             return null;  
  53.         }  
  54.         ByteArrayInputStream bais = null;  
  55.         ObjectInputStream ois = null;  
  56.         try {  
  57.             // 反序列化  
  58.             bais = new ByteArrayInputStream(bytes);  
  59.             ois = new ObjectInputStream(bais);  
  60.             return ois.readObject();  
  61.         } catch (Exception e) {  
  62.             e.printStackTrace();  
  63.         } finally {  
  64.             close(bais);  
  65.             close(ois);  
  66.         }  
  67.         return null;  
  68.     }  
  69.   
  70.     /** 
  71.      * 序列化 list 集合 
  72.      *  
  73.      * @param list 
  74.      * @return 
  75.      */  
  76.     public static byte[] serializeList(List<?> list) {  
  77.   
  78.         if (CommonUtil.isEmptyList(list)) {  
  79.             return null;  
  80.         }  
  81.         ObjectOutputStream oos = null;  
  82.         ByteArrayOutputStream baos = null;  
  83.         byte[] bytes = null;  
  84.         try {  
  85.             baos = new ByteArrayOutputStream();  
  86.             oos = new ObjectOutputStream(baos);  
  87.             for (Object obj : list) {  
  88.                 oos.writeObject(obj);  
  89.             }  
  90.             bytes = baos.toByteArray();  
  91.         } catch (Exception e) {  
  92.             e.printStackTrace();  
  93.         } finally {  
  94.             close(oos);  
  95.             close(baos);  
  96.         }  
  97.         return bytes;  
  98.     }  
  99.   
  100.     /** 
  101.      * 反序列化 list 集合 
  102.      *  
  103.      * @param lb 
  104.      * @return 
  105.      */  
  106.     public static List<?> unserializeList(byte[] bytes) {  
  107.         if (bytes == null) {  
  108.             return null;  
  109.         }  
  110.   
  111.         List<Object> list = new ArrayList<Object>();  
  112.         ByteArrayInputStream bais = null;  
  113.         ObjectInputStream ois = null;  
  114.         try {  
  115.             // 反序列化  
  116.             bais = new ByteArrayInputStream(bytes);  
  117.             ois = new ObjectInputStream(bais);  
  118.             while (bais.available() > 0) {  
  119.                 Object obj = (Object) ois.readObject();  
  120.                 if (obj == null) {  
  121.                     break;  
  122.                 }  
  123.                 list.add(obj);  
  124.             }  
  125.         } catch (Exception e) {  
  126.             e.printStackTrace();  
  127.         } finally {  
  128.             close(bais);  
  129.             close(ois);  
  130.         }  
  131.         return list;  
  132.     }  
  133.   
  134.     /** 
  135.      * 关闭io流对象 
  136.      *  
  137.      * @param closeable 
  138.      */  
  139.     public static void close(Closeable closeable) {  
  140.         if (closeable != null) {  
  141.             try {  
  142.                 closeable.close();  
  143.             } catch (Exception e) {  
  144.                 e.printStackTrace();  
  145.             }  
  146.         }  
  147.     }  
  148.   
  149. }  

redis工具类的部分方法,实现设置/获取对象和泛型值
[java] view plain copy
  1. /** 
  2.     * 设置对象 
  3.     * @param key 
  4.     * @param obj 
  5.     */  
  6.    public static void setObject(String key ,Object obj){  
  7.     try {  
  8.         obj = obj == null ? new Object():obj;  
  9.         getJedis().set(key.getBytes(), SerializeUtil.serialize(obj));  
  10.     } catch (Exception e) {  
  11.         e.printStackTrace();  
  12.     }  
  13. }  
  14.      
  15.    /** 
  16.     * 获取对象 
  17.     * @param key 
  18.     * @return Object 
  19.     */  
  20. public static Object getObject(String key){  
  21.     if(getJedis() == null || !getJedis().exists(key)){  
  22.         return null;  
  23.     }  
  24.     byte[] data = getJedis().get(key.getBytes());  
  25.     return (Object)SerializeUtil.unserialize(data);  
  26. }  
  27.   
  28. /** 
  29.     * 设置List集合 
  30.     * @param key 
  31.     * @param list 
  32.     */  
  33.    public static void setList(String key ,List<?> list){  
  34.     try {  
  35.           
  36.         if(CommonUtil.isNotEmptyList(list)){  
  37.             getJedis().set(key.getBytes(), SerializeUtil.serializeList(list));  
  38.         }else{//如果list为空,则设置一个空  
  39.             getJedis().set(key.getBytes(), "".getBytes());  
  40.         }  
  41.     } catch (Exception e) {  
  42.         e.printStackTrace();  
  43.     }  
  44. }  
  45.   
  46.    /** 
  47.     * 获取List集合 
  48.     * @param key 
  49.     * @return 
  50.     */  
  51. public static List<?> getList(String key){  
  52.     if(getJedis() == null || !getJedis().exists(key)){  
  53.         return null;  
  54.     }  
  55.     byte[] data = getJedis().get(key.getBytes());  
  56.     return SerializeUtil.unserializeList(data);  
  57. }  


测试main方法
[java] view plain copy
  1. public static void main(String[] args) {  
  2.         //object  
  3.         setObject("100",new Person("caspar",25));  
  4.           
  5.         Person p = (Person)getObject("100");  
  6.         System.out.println(p.getName()+"----"+p.getAge());  
  7.           
  8.         //list  
  9.         List<Person> list = new ArrayList<Person>();  
  10.         list.add(new Person("唐马儒",39));  
  11.         list.add(new Person("大便熊",33));  
  12.         list.add(new Person("小萝莉",14));  
  13.           
  14.         setList("list001", list);  
  15.         List<Person> resultList = (List<Person>) getList("list001");  
  16.         for (Person person : resultList) {  
  17.             System.out.println(person.getName()+"----"+person.getAge());  
  18.         }  
  19.     }  

输出结果

caspar----25
唐马儒----39
大便熊----33
小萝莉----14


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

建议使用json来存储

把object和list<?> 转成json的字符串格式再set到redis里面,取得时候再把json转换为需要的对象,这样简单快捷,推荐使用




原创粉丝点击