学习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. 诺基亚远去,《惊奇UCD》带你重塑用户体验

    我所说的成功的用户体验,是指我见过或听说过大量的用户非常喜爱我为手机行业做出的那些贡献.我的职业幸福感并不取决于我的经理或CEO说了什么,而是取决于我从实际用户那里听到了什么.             ...

  2. Card Flip

    卡牌效果:O(∩_∩)O,只做了webkit浏览器的效果,请用chrome~ 1.首先呢,先用一个框框把卡牌包住,然后呢,搞两个子元素作为卡牌正反面.当然咯,反面是看不见滴~ <section ...

  3. Rectangle Area

    class Solution { public: int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { l ...

  4. Ubuntu14 sudo apt-get install apt-show-versions出错

    vmware安装ubuntu后,sudo apt-get install apt-show-versions出现问题 E: Unable to locate package apt-show-vers ...

  5. IOS textView获取光标定位,以及选中

    当textview成为第一响应者的时候就会调用一个协议方法 - (void)textViewDidChangeSelection:(UITextView *)textView; 在这个协议方法中可以实 ...

  6. Topcoder SRM 683 Div2 B

    贪心的题,从左向右推过去即可 #include <vector> #include <list> #include <map> #include <set&g ...

  7. 中文 iOS/Mac 开发博客列表(转)

    转自https://github.com/tangqiaoboy/iOSBlogCN 中文 iOS/Mac 开发博客列表 本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息. 本博客列表 ...

  8. Java程序员们最常犯的10个错误

    将数组转化为一个列表时,程序员们经常这样做: List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个ArrayList对象 ...

  9. python之初级学习

    一.python安装 1.下载安装包(本人使用python3.5.1) https://www.python.org/downloads/ 2.安装python-3.5.1.exe 本人下载的是pyt ...

  10. 代码性能优化——task

    var t1 = Task.Factory.StartNew(delegate { //代码(查接口.数据库) }); 缺点: 不能使用request( HttpContext.Current.Req ...