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

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/9791.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论