redis在java项目中的使用

来源:互联网 发布:淘宝1688代销赚钱吗 编辑:程序博客网 时间:2024/04/29 18:00

在上一篇文章中已经讲了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(); }
}
复制代码

至此,redis在java项目中的使用就到此结束了。关于redis的其他命令,可以自己去百度下。

原创粉丝点击