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&lt;M&gt; deserialize(byte[] in) throws IOException {
    List&lt;M&gt; list = new ArrayList&lt;&gt;();
    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&lt;M&gt; values = (List&lt;M&gt;) 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();
 }
}