Redis学习笔记二
学习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学习笔记二的更多相关文章
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- redis 学习笔记二 (简单动态字符串)
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...
- StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...
- redis 学习笔记二
redis启动: 直接 redis-server.exe 启动服务,是按照redis默认配置启动的,如果想按照自己的配置文件启动,要加上 redis-server.exe redis.windows ...
- redis学习笔记(二)——java中jedis的简单使用
redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...
- Redis学习笔记二:单机数据库的实现
1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...
- 2019/1/10 redis学习笔记(二)
本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...
- redis 学习笔记(二)
1. 在centos下安装g++,如果输入 yum install g++,那么将会提示找不到g++.因为在centos下g++安装包名字叫做:gcc-c++ 所以应该输入 yum install g ...
- Redis学习笔记(二):Redis集群
集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能. 1.节点 一个节点就是一个运行在集群模式下的Redis服务器.启动Redis服务器时,通过判断cluster-enabl ...
随机推荐
- phpcms v9调用自定义字段的方法步骤
代码如下:{loop $shigongtu $r}<img src="{$r[url]} " title="测试"/>{/loop} 2 首页,分页 ...
- href="javascript:function()" 和onclick的区别
href='javascript:function()'和onclick能起到同样的效果,一般来说,如果要调用脚本还是在onclick事件里面写代码,而不推荐在href='javascript:fun ...
- oracle迁移postgres之-Ora2Pg
描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...
- java.sql.SQLException: null, message from server: "Host '192.168.xxx.xxx' is not allowed to connect to this MySQL server"
当你连接自己的电脑上的MySQL时,报这样的错,你可以把ip换成 127.0.0.1或者localhost ,当然前提是用户名和密码正确
- 面向对象day1
一.什么是面向对象 之前我们学习过面向过程和函数式编程,在讲函数的时候有说过之所以有函数式编程是因为面向过程编程是根据业务逻辑从上到下垒代码,会出现大量代码的重用和臃肿,so,函数式编程将同一功能的代 ...
- Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt
PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...
- android Json Gson FastJson 解析
一 Json xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
- 在Excel中制作雷达图
雷达图的作用 雷达图是专门用来进行多指标体系比较分析的专业图表.从雷达图中可以看出指标的实际值与参照值的偏离程度,从而为分析者提供有益的信息.雷达图一般用于成绩展示.效果对比量化.多维数据对比等等,只 ...
- 【转】如何查看当前Open的Cursor
遇到错误:A cursor with thename ' ' already exists,想要看是什么代码导致的.找到下面几种方法. --测试声明Cursor并且打开 DECLARE vend_cu ...
- ubuntu各种应用安装
微信安装,编译包下载,双击electronic-wechat就能用了,记得lock在launcher上 https://github.com/geeeeeeeeek/electronic-wechat ...