zoukankan      html  css  js  c++  java
  • Jedis存储Java对象Java序列化为byte数组方式

    在Jedis开发中,我们很多时候希望直接把一个对象放到Redis中,然后在需要的时候取出来。Redis的key和value都支持二进制安全的字符串,存储Java对象不是问题,下面我们看一下如何来实现。

    1、要存储的对象
    现在写一个很土的Java Bean,包含两个字段,id和name,类名叫做Person。为了实现序列化需求,该类实现Serializable接口。

    package com.ljq.test;
    
    import java.io.Serializable;
    
    @SuppressWarnings("serial")
    public class Person implements Serializable {
        private int id;
        private String name;
    
        public Person() {
        }
    
        public Person(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }

    2、序列化、反序列化
    写一个序列化工具类,来提供对象的序列化和反序列化的工作。代码如下:

    package com.ljq.test;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class SerializeUtil {
        /**
         * 序列化
         * 
         * @param object
         * @return
         */
        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) {
    
            }
            return null;
        }
    
        /**
         * 反序列化
         * 
         * @param bytes
         * @return
         */
        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) {
    
            }
            return null;
        }
    }

    3、单元测试
    使用junit对Jedis进行单元测试。代码如下:

    package com.ljq.test;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import redis.clients.jedis.Jedis;
    
    public class PersonRedisTest {
        private static Jedis jedis=null;
        
        /**
         * 初始化Jedis对象
         * 
         * @throws Exception
         */
        @Before
        public void before() throws Exception {
            jedis=new Jedis("127.0.0.1", 6379);
        }
        
        /**
         * 序列化写对象, 将Person对象写入Redis中
         * 
         * 我们到命令行窗口中读取该对象,看看有没有写入成功:
          * redis 127.0.0.1:6379> get person:100
         * "\xac\xed\x00\x05sr\x00\x15alanland.redis.Person\x05\xf4\x8d9A\xf4`\xb0\x02\x00\x02I\x00\x02idL\x00\x04namet\x00\x12Ljava/lang/String;xp\x00\x00\x00dt\x00\x04alan"
         * 可以取到序列化之后的值。
         */
        @Test
        public void setObject() {
            jedis.set("person:100".getBytes(), SerializeUtil.serialize(new Person(100, "zhangsan")));
            jedis.set("person:101".getBytes(), SerializeUtil.serialize(new Person(101, "bruce")));
        }
        
        /**
         * 反序列化取对象, 用Jedis获取对象
         * 
         */
        @Test
        public void getObject() {
            byte[] data100= jedis.get(("person:100").getBytes());
            Person person100 = (Person) SerializeUtil.unserialize(data100);
            System.out.println(String.format("person:100->id=%s,name=%s", person100.getId(), person100.getName()));
            
            byte[] data101= jedis.get(("person:101").getBytes());
            Person person101 = (Person) SerializeUtil.unserialize(data101);
            System.out.println(String.format("person:101->id=%s,name=%s", person101.getId(), person101.getName()));
        }
    }
  • 相关阅读:
    JDK中Unsafe类详解
    JAVA并发理论与实践
    关于FastJSON
    指数退避算法
    MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
    App开放接口api安全性—Token签名sign的设计与实现
    使用Jmeter进行http接口性能测试
    短信验证登录实现流程
    使用 Postman 取得 Token 打另一隻 API
    SpringMVC拦截器HandlerInterceptor使用
  • 原文地址:https://www.cnblogs.com/linjiqin/p/3105608.html
Copyright © 2011-2022 走看看