学习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. @Test
  23. public void test() {
  24. user = new User();
  25. user.setUsername("huifeidmeng");
  26. user.setAge();
  27.  
  28. try {
  29. byteArrayOutputStream = new ByteArrayOutputStream();
  30. outputStream = new ObjectOutputStream(byteArrayOutputStream);
  31. outputStream.writeObject(user);
  32. result = byteArrayOutputStream.toByteArray();
  33. } catch (IOException e1) {
  34. e1.printStackTrace();
  35. } finally {
  36. try {
  37. if (outputStream != null) outputStream.close();
  38. if (byteArrayOutputStream != null) byteArrayOutputStream.close();
  39. } catch (IOException e2) {
  40. e2.printStackTrace();
  41. }
  42. }
  43. /*tmp sout*/
  44. System.out.println(result);
  45. User tmpUser = new User();
  46. try {
  47. byteArrayInputStream = new ByteArrayInputStream(result);
  48. inputStream = new ObjectInputStream(byteArrayInputStream);
  49. tmpUser = (User) inputStream.readObject();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. } catch (ClassNotFoundException e3) {
  53. e3.printStackTrace();
  54. } finally {
  55. try {
  56. if (byteArrayInputStream != null) byteArrayInputStream.close();
  57. if (inputStream != null) inputStream.close();
  58. } catch (IOException e4) {
  59. e4.printStackTrace();
  60. }
  61.  
  62. }
  63. System.out.println(tmpUser.getUsername() + ": " + tmpUser.getAge());
  64. }
  65.  
  66. }
  67.  
  68. class User implements Serializable {
  69. private static final long serialVersionUID = -1941046831377985500L;
  70. String username;
  71. Integer age;
  72.  
  73. public User() {
  74. }
  75.  
  76. public String getUsername() {
  77. return username;
  78. }
  79.  
  80. public void setUsername(String username) {
  81. this.username = username;
  82. }
  83.  
  84. public Integer getAge() {
  85. return age;
  86. }
  87.  
  88. public void setAge(Integer age) {
  89. this.age = age;
  90. }
  91. }

在编写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. JedisPool pool;
  21. Jedis jedis;
  22.  
  23. /**
  24. * connection
  25. */
  26. @Before
  27. public void init() {
  28. pool = new JedisPool(new JedisPoolConfig(), "localhost");
  29. jedis = pool.getResource();
  30. //jedis.auth("*******"); //密码验证
  31. }
  32.  
  33. /**
  34. * for object*
  35. */
  36. @Test
  37. public void testObject() {
  38.  
  39. SerializableTool serializableTool = new SerializableTool();
  40. UserModel userModel = new UserModel();
  41. userModel.setAge(123);
  42. userModel.setUsername("huifeidmeng");
  43. userModel.setPassword("******");
  44. byte[] bytes = serializableTool.serializable(userModel);
  45. jedis.set("useModel".getBytes(), bytes);
  46. byte[] result = jedis.get("useModel".getBytes());
  47. Object object = serializableTool.unSerializable(result);
  48. UserModel tmpUser = (UserModel) object;
  49. System.out.println(tmpUser.toString());
  50. }
  51.  
  52. }

运行结果:

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. .net(C#)中结构和类的区别

    static void Main(string[] args) { //类型 //结构:值类型 //类:引用类型 //声明的语法:class struct //在类中,构造函数里,既可以给字段赋值,也 ...

  2. 使用dom4j操作XML

    DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...

  3. QT网络编程

    bool QAbstractSocket::waitForReadyRead(int msecs = 30000) bool QAbstractSocket::waitForDisconnected( ...

  4. MHA故障切换和在线手工切换原理

    一.故障切换的过程 当master_manager监控到主库mysqld服务停止后,首先对主库进行SSH登录检查(save_binary_logs -command=test),然后对mysqld服务 ...

  5. CryptoJS DES加密

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equ ...

  6. 根据osdid 查询磁盘是ssd盘还是sas盘

    前置条件: 1.安装LSI的Megacli软件包 Megacli64 2.安装scsi设备的查询工具lsscsi apt-get install lsscsi   步骤: 1.根据osdid 查找 盘 ...

  7. winform常用的属性(listview),常用容器(二者结合)

    ListVies控件主要用于展示数据(非常实用和重要的控件) FullRowSelect:设置是否行选择模式.(默认为false) (开启之后一下选中一行数据) ___________________ ...

  8. tomcat7+jdk1.8一键安装脚本

    #!/bin/bash #--------------------------------------------------------------------- # # Author : 大象无形 ...

  9. Oracle建表

    1.oracle数据库中的多种数据结构: 1.表结构            存储数据 2.视图 一张表或多张表中数据的字节 3.sequence 主要用来生成主键值 4.index 提高检索性能 我们 ...

  10. HDU 5968 异或密码

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...