Redis学习笔记二

  学习Redis添加Object时,由于Redis只能存取字符串String,对于其它数据类型形容:Int,long,double,Date等不提供支持,因而需要设计到对象的序列化和反序列化.java序列化的过程就是将对象转变为byte,字节码的过程. Java的反序列过程就是就是将字节码恢复成对象的过程。

一正一逆,也迎合了电脑存储数据的特点。

    关于Java的序列化和反序列化的Demo:

 1 package hbut.base;
 2 
 3 import org.junit.Test;
 4 
 5 import java.io.*;
 6 
 7 /**
 8  * @Author XiJun.Gong
 9  * @DATE 2016/6/12.
10  * aim:   hbut.base
11  * function: 对象的序列化和反序列
12  */
13 public class serializableDemo {
14 
15     private User user = null;
16     private ByteArrayOutputStream byteArrayOutputStream = null;
17     private ObjectOutputStream outputStream = null;
18     private ObjectInputStream inputStream = null;
19     private ByteArrayInputStream byteArrayInputStream = null;
20     private byte[] result;
21 
22 
23 
24     @Test
25     public void test() {
26         user = new User();
27         user.setUsername("huifeidmeng");
28         user.setAge(123);
29 
30         try {
31             byteArrayOutputStream = new ByteArrayOutputStream();
32             outputStream = new ObjectOutputStream(byteArrayOutputStream);
33             outputStream.writeObject(user);
34             result = byteArrayOutputStream.toByteArray();
35         } catch (IOException e1) {
36             e1.printStackTrace();
37         } finally {
38             try {
39                 if (outputStream != null) outputStream.close();
40                 if (byteArrayOutputStream != null) byteArrayOutputStream.close();
41             } catch (IOException e2) {
42                 e2.printStackTrace();
43             }
44         }
45         /*tmp sout*/
46         System.out.println(result);
47         User tmpUser = new User();
48         try {
49             byteArrayInputStream = new ByteArrayInputStream(result);
50             inputStream = new ObjectInputStream(byteArrayInputStream);
51             tmpUser = (User) inputStream.readObject();
52         } catch (IOException e) {
53             e.printStackTrace();
54         } catch (ClassNotFoundException e3) {
55             e3.printStackTrace();
56         } finally {
57             try {
58                 if (byteArrayInputStream != null) byteArrayInputStream.close();
59                 if (inputStream != null) inputStream.close();
60             } catch (IOException e4) {
61                 e4.printStackTrace();
62             }
63 
64         }
65         System.out.println(tmpUser.getUsername() + ":   " + tmpUser.getAge());
66     }
67 
68 }
69 
70 
71 class User implements Serializable {
72     private static final long serialVersionUID = -1941046831377985500L;
73     String username;
74     Integer age;
75 
76     public User() {
77     }
78 
79     public String getUsername() {
80         return username;
81     }
82 
83     public void setUsername(String username) {
84         this.username = username;
85     }
86 
87     public Integer getAge() {
88         return age;
89     }
90 
91     public void setAge(Integer age) {
92         this.age = age;
93     }
94 }

在编写demo的过程中,发现一个问题,当使用内部类作为对象的的时候,序列化总是抛出异常,但是一旦将User类迁出的时候,又恢复正常。

关于序列化和反序列工具类Dmeo:

 1 package com.hbut.util;
 2 
 3 import java.io.*;
 4 
 5 /**
 6  * @Author XiJun.Gong
 7  * @DATE 2016/6/13.
 8  * aim:   com.hbut.util
 9  */
10 public class SerializableTool {
11 
12     private ByteArrayOutputStream byteArrayOutputStream = null;
13     private ObjectOutputStream outputStream = null;
14     private ObjectInputStream inputStream = null;
15     private ByteArrayInputStream byteArrayInputStream = null;
16 
17     public byte[] serializable(Object object) {
18         byte[] result = null;
19         try {
20             byteArrayOutputStream = new ByteArrayOutputStream();
21             outputStream = new ObjectOutputStream(byteArrayOutputStream);
22             outputStream.writeObject(object);
23             result = byteArrayOutputStream.toByteArray();
24         } catch (IOException e1) {
25             e1.printStackTrace();
26         } finally {
27             try {
28                 if (outputStream != null) outputStream.close();
29                 if (byteArrayOutputStream != null) byteArrayOutputStream.close();
30             } catch (IOException e2) {
31                 e2.printStackTrace();
32             }
33         }
34         return result;
35     }
36 
37     public Object unSerializable(byte[] bytes) {
38         Object object = null;
39         try {
40             byteArrayInputStream = new ByteArrayInputStream(bytes);
41             inputStream = new ObjectInputStream(byteArrayInputStream);
42             object = inputStream.readObject();
43         } catch (IOException e) {
44             e.printStackTrace();
45         } catch (ClassNotFoundException e3) {
46             e3.printStackTrace();
47         } finally {
48             try {
49                 if (byteArrayInputStream != null) byteArrayInputStream.close();
50                 if (inputStream != null) inputStream.close();
51             } catch (IOException e4) {
52                 e4.printStackTrace();
53             }
54         }
55         return object;
56     }
57 }

  Redis存取对象和读取对象Demo

 1 class UserModel implements Serializable {
 2 
 3     private String username;
 4     private String password;
 5     private Integer age;
 6 
 7     @Override
 8     public String toString() {
 9         return "UserModel{" +
10                 "username='" + username + '\'' +
11                 ", password='" + password + '\'' +
12                 ", age=" + age +
13                 '}';
14     }
15 
16     public UserModel() {
17 
18     }
19 
20     public Integer getAge() {
21         return age;
22     }
23 
24     public void setAge(Integer age) {
25         this.age = age;
26     }
27 
28     public String getUsername() {
29 
30         return username;
31     }
32 
33     public void setUsername(String username) {
34         this.username = username;
35     }
36 
37     public String getPassword() {
38         return password;
39     }
40 
41     public void setPassword(String password) {
42         this.password = password;
43     }
44 }

该是这部分的继续:

启动Redis服务器,后运行如下代码:

 1 package com.hbut.util;
 2 
 3 import com.google.common.collect.Maps;
 4 import org.junit.Before;
 5 import org.junit.Test;
 6 import redis.clients.jedis.Jedis;
 7 import redis.clients.jedis.JedisPool;
 8 import redis.clients.jedis.JedisPoolConfig;
 9 
10 import java.io.Serializable;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Map;
14 
15 /**
16  * Created by XiJun.Gong on 14-2-28.
17  */
18 public class TestRedis {
19 
20 
21     JedisPool pool;
22     Jedis jedis;
23 
24     /**
25      * connection
26      */
27     @Before
28     public void init() {
29         pool = new JedisPool(new JedisPoolConfig(), "localhost");
30         jedis = pool.getResource();
31         //jedis.auth("*******"); //密码验证
32     }
33 
34     /**
35      * for object*
36      */
37     @Test
38     public void testObject() {
39 
40         SerializableTool serializableTool = new SerializableTool();
41         UserModel userModel = new UserModel();
42         userModel.setAge(123);
43         userModel.setUsername("huifeidmeng");
44         userModel.setPassword("******");
45         byte[] bytes = serializableTool.serializable(userModel);
46         jedis.set("useModel".getBytes(), bytes);
47         byte[] result = jedis.get("useModel".getBytes());
48         Object object = serializableTool.unSerializable(result);
49         UserModel tmpUser = (UserModel) object;
50         System.out.println(tmpUser.toString());
51     }
52 
53 }

运行结果:

   UserModel{username='huifeidmeng', password='******', age=123}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

Hadoop--倒排索引过程详解

倒排索引就是根据单词内容来查找文档的方式,由于不是根据文档来确定文档所包含的内容,进行了相反的操作,所以被称为倒排索引 下面来看一个例子来理解什么是倒排索引 这...

5509
来自专栏Albert陈凯

2018-04-17 Java的Collection集合类3分钟搞掂Set集合前言

3分钟搞掂Set集合 前言 声明,本文用的是jdk1.8 现在这篇主要讲Set集合的三个子类: HashSet集合 A:底层数据结构是哈希表(是一个元素为链...

3027
来自专栏Java编程

20个非常有用的Java程序片段

下面是20个非常有用的Java程序片段,希望能对你有用。

1.4K0
来自专栏函数式编程语言及工具

SDP(9):MongoDB-Scala - data access and modeling

    MongoDB是一种文件型数据库,对数据格式没有硬性要求,所以可以实现灵活多变的数据存储和读取。MongoDB又是一种分布式数据库,与传统关系数据库不同...

3934
来自专栏浪淘沙

spark求最受欢迎的老师的问题

1143
来自专栏我是攻城师

Fastjson解析嵌套Map例子

4215
来自专栏技术专栏

java程序 如何优雅地读取xml文件

1.2K2
来自专栏扎心了老铁

spark三种连接join

本文主要介绍spark join相关操作。 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前...

3768
来自专栏码匠的流水账

聊聊storm TridentTopology的构建

storm-core-1.2.2-sources.jar!/org/apache/storm/trident/TridentTopology.java

1903
来自专栏Java编程

20个非常有用的Java程序片段

下面是20个非常有用的Java程序片段,希望能对你有用。

7682

扫码关注云+社区

领取腾讯云代金券