• 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();
     }
    }

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

  • 相关阅读:
    SSAS Tabular模式中关系设置不支持直接设置多对多?
    【转载】SSAS-MDX#001
    【转载】MSDN-MDX#001
    【转载】MDX Step by Step 读书笔记(三)
    一段话理解 MDX中的Select 、轴、COLUMNS、ROWS
    【转载】MDX Step by Step 读书笔记(四)
    MDX常用几种查询对比
    层次结构
    多事实表 SQL实现和SSAS中MDX实现的差异
    SQL Full Join 的 Where条件
  • 原文地址:https://www.cnblogs.com/huskyking/p/6007003.html
Copyright © 2020-2023  润新知