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

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

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

 package hbut.base;

 import org.junit.Test;

 import java.io.*;

 /**
* @Author XiJun.Gong
* @DATE 2016/6/12.
* aim: hbut.base
* function: 对象的序列化和反序列
*/
public class serializableDemo { private User user = null;
private ByteArrayOutputStream byteArrayOutputStream = null;
private ObjectOutputStream outputStream = null;
private ObjectInputStream inputStream = null;
private ByteArrayInputStream byteArrayInputStream = null;
private byte[] result; @Test
public void test() {
user = new User();
user.setUsername("huifeidmeng");
user.setAge(); try {
byteArrayOutputStream = new ByteArrayOutputStream();
outputStream = new ObjectOutputStream(byteArrayOutputStream);
outputStream.writeObject(user);
result = byteArrayOutputStream.toByteArray();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
if (outputStream != null) outputStream.close();
if (byteArrayOutputStream != null) byteArrayOutputStream.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
/*tmp sout*/
System.out.println(result);
User tmpUser = new User();
try {
byteArrayInputStream = new ByteArrayInputStream(result);
inputStream = new ObjectInputStream(byteArrayInputStream);
tmpUser = (User) inputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e3) {
e3.printStackTrace();
} finally {
try {
if (byteArrayInputStream != null) byteArrayInputStream.close();
if (inputStream != null) inputStream.close();
} catch (IOException e4) {
e4.printStackTrace();
} }
System.out.println(tmpUser.getUsername() + ": " + tmpUser.getAge());
} } class User implements Serializable {
private static final long serialVersionUID = -1941046831377985500L;
String username;
Integer age; public User() {
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

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

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

 package com.hbut.util;

 import java.io.*;

 /**
* @Author XiJun.Gong
* @DATE 2016/6/13.
* aim: com.hbut.util
*/
public class SerializableTool { private ByteArrayOutputStream byteArrayOutputStream = null;
private ObjectOutputStream outputStream = null;
private ObjectInputStream inputStream = null;
private ByteArrayInputStream byteArrayInputStream = null; public byte[] serializable(Object object) {
byte[] result = null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
outputStream = new ObjectOutputStream(byteArrayOutputStream);
outputStream.writeObject(object);
result = byteArrayOutputStream.toByteArray();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
if (outputStream != null) outputStream.close();
if (byteArrayOutputStream != null) byteArrayOutputStream.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
return result;
} public Object unSerializable(byte[] bytes) {
Object object = null;
try {
byteArrayInputStream = new ByteArrayInputStream(bytes);
inputStream = new ObjectInputStream(byteArrayInputStream);
object = inputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e3) {
e3.printStackTrace();
} finally {
try {
if (byteArrayInputStream != null) byteArrayInputStream.close();
if (inputStream != null) inputStream.close();
} catch (IOException e4) {
e4.printStackTrace();
}
}
return object;
}
}

Redis存取对象和读取对象Demo

 class UserModel implements Serializable {

     private String username;
private String password;
private Integer age; @Override
public String toString() {
return "UserModel{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
} public UserModel() { } public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getUsername() { return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

该是这部分的继续:

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

 package com.hbut.util;

 import com.google.common.collect.Maps;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map; /**
* Created by XiJun.Gong on 14-2-28.
*/
public class TestRedis { JedisPool pool;
Jedis jedis; /**
* connection
*/
@Before
public void init() {
pool = new JedisPool(new JedisPoolConfig(), "localhost");
jedis = pool.getResource();
//jedis.auth("*******"); //密码验证
} /**
* for object*
*/
@Test
public void testObject() { SerializableTool serializableTool = new SerializableTool();
UserModel userModel = new UserModel();
userModel.setAge(123);
userModel.setUsername("huifeidmeng");
userModel.setPassword("******");
byte[] bytes = serializableTool.serializable(userModel);
jedis.set("useModel".getBytes(), bytes);
byte[] result = jedis.get("useModel".getBytes());
Object object = serializableTool.unSerializable(result);
UserModel tmpUser = (UserModel) object;
System.out.println(tmpUser.toString());
} }

运行结果:

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

Redis学习笔记二的更多相关文章

  1. Redis学习笔记二 (BitMap算法分析与BitCount语法)

    Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...

  2. redis 学习笔记二 (简单动态字符串)

    redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...

  3. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...

  4. redis 学习笔记二

    redis启动: 直接 redis-server.exe 启动服务,是按照redis默认配置启动的,如果想按照自己的配置文件启动,要加上 redis-server.exe  redis.windows ...

  5. redis学习笔记(二)——java中jedis的简单使用

    redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...

  6. Redis学习笔记二:单机数据库的实现

    1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...

  7. 2019/1/10 redis学习笔记(二)

    本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...

  8. redis 学习笔记(二)

    1. 在centos下安装g++,如果输入 yum install g++,那么将会提示找不到g++.因为在centos下g++安装包名字叫做:gcc-c++ 所以应该输入 yum install g ...

  9. Redis学习笔记(二):Redis集群

    集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.   1.节点 一个节点就是一个运行在集群模式下的Redis服务器.启动Redis服务器时,通过判断cluster-enabl ...

随机推荐

  1. 介绍Ext JS 4.2的新特性的《深入浅出Ext JS》上市

    以用户为中心的时代,应用的界面外观变得越来越重要.然而,很多程序员都缺乏美术功底,要开发出界面美观的应用实属不易.Ext JS的出现,为广大程序员解决了这一难题.它有丰富多彩的界面和强大的功能,是开发 ...

  2. ReactiveCocoa的一些使用

    作为一名iOS开发者, 你写的每一行代码几乎都是对某些事件的反馈:点击button.接收到网络信息. 一个属性的改变(通过KVO监测) 或者 通过CoreLocation监听用户所在位置的变化 以上等 ...

  3. 最近几天玩freebsd奋斗成果总结

    玩freebsd发现真的很累人..相信如下问题第一次玩freebsd都遇到过: 安装系统默认只有文本模式,需要手工安装gnome,kde等desktop environment. Freebsd安装. ...

  4. LabVIEW如何调用C#Winform

    界面交互并不是Labview的强项,使用Labview创建UI时候总会受制于VI有限的控件,有限的皮肤和有限的控件事件.而当需要实现UI的多文档的窗口,窗口的浮动停靠,动画等功能时还需要花很大的功夫. ...

  5. 什么是Unicode letter

    起因:从一段代码说起 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  6. Android 逐帧动画

    原理: 逐帧动画是最简单的一种动画.原理就是把几张图片连续显示出来,以达到动画的效果.就相当于下面这种手绘翻页动画啦~ 实现: 1.需要建立一个animation-list来设置静态图片资源.持续时间 ...

  7. 深入分析ClassLoader

    首先介绍下ClassLoader: ClassLoader顾名思义就是类加载器,负责将Class加载到JVM中,事实上ClassLoader除了能将Class加载到JVM中之外,还有一个重要的作用就是 ...

  8. jQuery实践——选择器篇

      一.基本 #id: html:<div id="demo1">demo1</div> jQuery:$("#demo1").css( ...

  9. Digital Roots

    Background The digital root of a positive integer is found by summing the digits of the integer. If ...

  10. Download Oracle Forms 6i

    To download Oracle Forms Developer 6i from Oracle click this link http://download.oracle.com/otn/nt/ ...