• 【Redis】解析Redis和Java传递数据


    在Java中使用Redis之前需要导入 jedis.jar 包,由于Redis是基于key-value进行数据存储,java中的数据存储到Redis中有许多方式,这里笔者介绍采用JSON字符串和对象序列化两种方式。

    1,使用JSON方式

    • 首先将Java对象转化为JSON字符串

    • 然后将JSON字符串存储到Redis中

    • 最后把JSON字符串从Redis中取出来,并且转化为Java对象

    首先导入和JSON使用相关的包: gson.jar

    实体类Person的代码如下:

    package cn.wxg.person;
    
    import java.io.Serializable;
    
    public class Person{
    
        private String name;
        private int age;
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Person() {
            super();
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        
        
    }
    Person.java

    (1).将Java对象通过JSON存储到Redis中

            //创建Jedis对象
            Jedis jedis=new Jedis("127.0.0.1");
            
            //添加需要存储的数据
            Person person=new Person();
            List<Person> persons=new ArrayList<Person>();
            persons.add(new Person("jame",3));
            persons.add(new Person("james",3));
            persons.add(new Person("ja",3));
            
            //将数据转化为JSON字符串,存储到Redis中
            jedis.set("person",new Gson().toJson(persons));

    (2).将Redis中的JSON字符串读取出,然后转化为Java对象

            //创建Jedis对象
            Jedis jedis=new Jedis("127.0.0.1");
            //读取数据
            String str = jedis.get("person");
            //再将数据转化为Java对象
            List<Person> fj = new Gson().fromJson(str, List.class);
            //输出数据
            Iterator<Person> iterator = fj.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }

    这种通过Json的方式比较好理解,关于这种方式的更多信息还可以参见详解JAVA对象JSON的解析

    2,使用对象序列化方式

    在使用这种方式之前,需要存储到实体类需要序列化,否则就不能存储。

    实体类Person的代码如下:

    package cn.wxg.person;
    
    import java.io.Serializable;
    
    public class Person implements Serializable{
    
        private static final long serialVersionUID = 1L;
        private String name;
        private int age;
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public Person() {
            super();
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        
        
    }
    Person.java

    工具类的方法SerializeUtil如下:

    package cn.wxg.util;
    
    import java.io.*;
    
    public class SerializeUtil {
        
        public static byte[] serialize(Object object) {
            ObjectOutputStream oos = null;
            ByteArrayOutputStream baos = null;
            try {
                // 序列化
                baos = new ByteArrayOutputStream();
                oos = new ObjectOutputStream(baos);
                oos.writeObject(object);
                byte[] bytes = baos.toByteArray();
                return bytes;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        public static Object unserialize(byte[] bytes) {
            ByteArrayInputStream bais = null;
            try {
                // 反序列化
                bais = new ByteArrayInputStream(bytes);
                ObjectInputStream ois = new ObjectInputStream(bais);
                return ois.readObject();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            
        }
    }
    SerializeUtil.java

    (1)将对象序列化,并且存储到Redis中

            //创建Jedis对象
            Jedis jedis=new Jedis("127.0.0.1");
            //需要存储的数据
            Person person=new Person();
            List<Person> persons=new ArrayList<Person>();
            persons.add(new Person("jame",3));
            persons.add(new Person("james",3));
            persons.add(new Person("ja",3));
            //对存储的数据序列化
            byte[] bt = SerializeUtil.serialize(persons);
            //将字节数据存储到Redis中
            jedis.set("persons".getBytes(),bt);

    (2)从Redis中读取数据,然后反序列化,得到Java对象

            //创建Jedis对象
            Jedis jedis=new Jedis("127.0.0.1");
            //需要存储的数据
            Person person=new Person();
            List<Person> persons=new ArrayList<Person>();
            persons.add(new Person("jame",3));
            persons.add(new Person("james",3));
            persons.add(new Person("ja",3));
            //对存储的数据序列化
            byte[] bt = SerializeUtil.serialize(persons);
            //将字节数据存储到Redis中
            jedis.set("persons".getBytes(),bt);

    这种方式效率比第一种高,推荐第二种。

    3,Redis的使用地方

    Redis可以用于性能优化,在这篇文章中SpringMVC详解AOP中,说到了如何进行程序性能监听。如果我们发现程序的速度表较慢的话,可以尝试使用Redis进行缓存优化。
    使用Redis缓存的思路为:

        @RequestMapping("querybook.do")
        public ModelAndView querybook(Integer bookId){
            //查看在Redis中是否有该书籍的信息
            Jedis jedis=new Jedis();
            Book book=jedis.get(bookId.toString());
            if(book!=null){
            //直接把Redis读取的数据返回
                return book;
            }else{
            //从数据库中读取数据
                book=Database.query(bookId);
            //将数据存储到Redis中
                jedis.set("book".getBytes(),SerializeUtil.serialize(book));
            //将数据返回
                return book;
            }
        }

    这里笔者再总结一下,就是在用户请求的时候,首先查看Redis中是否有该数据(因为从Redis中取数据的速度比从关系型数据库中取要快得多),如果有就直接从Redis中取,如果没有就从数据库中取,然后再把取出来的数据放到Redis中,这样的话下次用户请求的时候就可以直接从Redis中读取数据了。

    使用Redis作为中间缓存,会增加很多逻辑控制代码。比如使用Oracle作为关系型数据库,Redis作为中间缓存,那么Oracle和Redis的数据是不同步的,这时候对用户的一些基本操作(增、删、改、查)就会添加很多控制代码,以保证Oracle和Redis中的数据一致性。

  • 相关阅读:
    自己动手实现一个WEB服务器
    Java SPI机制和使用示例
    Redis笔记(七):Redis应用场景
    Linux笔记:linux常用命令
    Linux笔记:vi常用命令
    PostgreSQL执行超时的问题
    Redis笔记(五):Redis发布订阅
    Redis笔记(四):Redis事务支持
    Redis笔记(三):Redis常用命令
    Redis笔记(二):Redis数据类型
  • 原文地址:https://www.cnblogs.com/HDK2016/p/7235919.html
Copyright © 2020-2023  润新知