redis在java项目中的使用

在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用。

redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字,字符串等,可以用string-value的形式存储;另一种是存对象、集合等,最好用序列化的方式来存储。

1、存储简单数据

复制代码
try {
    Jedis jedis = new Jedis();
    jedis.set("name", "JackGSmith");
} catch (Exception e) {
    //如果缓存连不上,则不处理
    System.out.println("登录无法更新该用户缓存");
}
复制代码

从redis缓存中获取key为“name”的值,使用jedis.get("name"),用一个String变量接收即可。

2、存储对象、集合

存对象集合用序列化的方式存储,用反序列化的方式取值。存储的key和value都是转化成字节码的形式。

先定义一个抽象类:SerializeTranscoder.java,代码如下:

复制代码
package cn.com.taiji.sample.utils;

import java.io.Closeable;
import java.io.IOException;

public abstract class SerializeTranscoder {
      
      public abstract byte[] serialize(Object value);
      
      public abstract Object deserialize(byte[] in) throws IOException;
      
      public void close(Closeable closeable) {
        if (closeable != null) {
          try {
            closeable.close();
          } catch (Exception e) {
              e.printStackTrace();
          }
        }
      }
}
复制代码

再建一个序列化的类,ObjectTranscoder.java,继承上面这个抽象类,该类是用来序列化存储对象用的,代码如下:

复制代码
package cn.com.taiji.sample.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ObjectTranscoder<M extends Serializable> extends SerializeTranscoder{

    @SuppressWarnings("unchecked")
      @Override
      public byte[] serialize(Object value) {
        if (value == null) {  
          throw new NullPointerException("Can't serialize null");  
        }  
        byte[] result = null;  
        ByteArrayOutputStream bos = null;  
        ObjectOutputStream os = null;  
        try {  
          bos = new ByteArrayOutputStream();  
          os = new ObjectOutputStream(bos);
          M m = (M) value;
          os.writeObject(m);  
          os.close();  
          bos.close();  
          result = bos.toByteArray();  
        } catch (IOException e) {  
          throw new IllegalArgumentException("Non-serializable object", e);  
        } finally {  
          close(os);  
          close(bos);  
        }  
        return result;  
      }

      @SuppressWarnings("unchecked")
      @Override
      public M deserialize(byte[] in) {
        M result = null;  
        ByteArrayInputStream bis = null;  
        ObjectInputStream is = null;  
        try {  
          if (in != null) {  
            bis = new ByteArrayInputStream(in);  
            is = new ObjectInputStream(bis);  
            result = (M) is.readObject();  
            is.close();  
            bis.close();  
          }  
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();
        } finally {  
          close(is);  
          close(bis);  
        }  
        return result;  
      }
}
复制代码

接着在新建一个ListTranscoder.java文件,用来序列化存储List(集合)对象,基本同上,代码如下:

复制代码
package cn.com.taiji.sample.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class ListTranscoder<M extends Serializable> extends SerializeTranscoder {

    @SuppressWarnings("unchecked")
    public List<M> deserialize(byte[] in) throws IOException {
        List<M> list = new ArrayList<>();
        ByteArrayInputStream bis = null;
        ObjectInputStream is = null;
        try {
          if (in != null) {
            bis = new ByteArrayInputStream(in);
            is = new ObjectInputStream(bis);
            while (true) {
              M m = (M)is.readObject();
              if (m == null) {
                break;
              }
              list.add(m);
            }
            is.close();
            bis.close();
          }
      } catch (Exception e) {  
        //  e.printStackTrace(); 
      }  finally {
          is.close();
          bis.close();
        }
        return  list;
      }
    
    @SuppressWarnings("unchecked")
    @Override
      public byte[] serialize(Object value) {
        if (value == null)
          throw new NullPointerException("Can't serialize null");

        List<M> values = (List<M>) value;
        byte[] results = null;
        ByteArrayOutputStream bos = null;
        ObjectOutputStream os = null;
        
        try {
          bos = new ByteArrayOutputStream();
          os = new ObjectOutputStream(bos);
          for (M m : values) {
            os.writeObject(m);
          }
          results = bos.toByteArray();
          os.close();
          bos.close();
        } catch (IOException e) {
          throw new IllegalArgumentException("Non-serializable object", e);
        } finally {
          close(os);
          close(bos);
        }
        return results;
      }
}
复制代码

现在,就可以用序列化的方式存储对象或集合了:

复制代码
try {
    Jedis jedis = new Jedis();
    List<SystemNotice> noticeList = systemNoticeManager.listQuery(noticeQModel);
    if(noticeList.size()>0 && noticeList != null){
    ListTranscoder<SystemNotice> listTranscoder = new ListTranscoder<SystemNotice>();
    jedis.set(loginUser.getId().getBytes(), listTranscoder.serialize(noticeList));
    }
} catch (Exception e) {
    //如果缓存连不上,则不处理
    System.out.println("登录无法更新该用户缓存");
    }
复制代码

存的key使用用户id,所以取出list就很简单了:

复制代码
try {
 Jedis jedis = new Jedis();
 byte[] list = jedis.get(loginUser.getId().getBytes());
 ListTranscoder<SystemNotice> listTranscoder = new ListTranscoder<SystemNotice>();
 List<SystemNotice> newList = listTranscoder.deserialize(list);try {
   responseJson(JsonTools.toJsonStr(newList), response);
 } catch (IOException e) {
    e.printStackTrace();
 }
}
posted @ 2018-05-16 09:07  Roger胜  阅读(2876)  评论(0编辑  收藏  举报