【Redis】解析Redis和Java传递数据
在Java中使用Redis之前需要导入 jedis.jar 包,由于Redis是基于key-value进行数据存储,java中的数据存储到Redis中有许多方式,这里笔者介绍采用JSON字符串和对象序列化两种方式。
1,使用JSON方式
- 首先将Java对象转化为JSON字符串 
- 然后将JSON字符串存储到Redis中 
- 最后把JSON字符串从Redis中取出来,并且转化为Java对象 
首先导入和JSON使用相关的包: gson.jar
实体类Person的代码如下:
package cn.wxg.person;
import java.io.Serializable;
public class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Person() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}
Person.java
(1).将Java对象通过JSON存储到Redis中
//创建Jedis对象
Jedis jedis=new Jedis("127.0.0.1"); //添加需要存储的数据
Person person=new Person();
List<Person> persons=new ArrayList<Person>();
persons.add(new Person("jame",3));
persons.add(new Person("james",3));
persons.add(new Person("ja",3)); //将数据转化为JSON字符串,存储到Redis中
jedis.set("person",new Gson().toJson(persons));
(2).将Redis中的JSON字符串读取出,然后转化为Java对象
//创建Jedis对象
Jedis jedis=new Jedis("127.0.0.1");
//读取数据
String str = jedis.get("person");
//再将数据转化为Java对象
List<Person> fj = new Gson().fromJson(str, List.class);
//输出数据
Iterator<Person> iterator = fj.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
这种通过Json的方式比较好理解,关于这种方式的更多信息还可以参见详解JAVA对象JSON的解析
2,使用对象序列化方式
在使用这种方式之前,需要存储到实体类需要序列化,否则就不能存储。
实体类Person的代码如下:
package cn.wxg.person;
import java.io.Serializable;
public class Person implements Serializable{
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Person() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}
Person.java
工具类的方法SerializeUtil如下:
package cn.wxg.util;
import java.io.*;
public class SerializeUtil {
    public static byte[] serialize(Object object) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            // 序列化
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    public static Object unserialize(byte[] bytes) {
        ByteArrayInputStream bais = null;
        try {
            // 反序列化
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
SerializeUtil.java
(1)将对象序列化,并且存储到Redis中
//创建Jedis对象
Jedis jedis=new Jedis("127.0.0.1");
//需要存储的数据
Person person=new Person();
List<Person> persons=new ArrayList<Person>();
persons.add(new Person("jame",3));
persons.add(new Person("james",3));
persons.add(new Person("ja",3));
//对存储的数据序列化
byte[] bt = SerializeUtil.serialize(persons);
//将字节数据存储到Redis中
jedis.set("persons".getBytes(),bt);
(2)从Redis中读取数据,然后反序列化,得到Java对象
//创建Jedis对象
Jedis jedis=new Jedis("127.0.0.1");
//需要存储的数据
Person person=new Person();
List<Person> persons=new ArrayList<Person>();
persons.add(new Person("jame",3));
persons.add(new Person("james",3));
persons.add(new Person("ja",3));
//对存储的数据序列化
byte[] bt = SerializeUtil.serialize(persons);
//将字节数据存储到Redis中
jedis.set("persons".getBytes(),bt);
这种方式效率比第一种高,推荐第二种。
3,Redis的使用地方
Redis可以用于性能优化,在这篇文章中SpringMVC详解AOP中,说到了如何进行程序性能监听。如果我们发现程序的速度表较慢的话,可以尝试使用Redis进行缓存优化。
使用Redis缓存的思路为:
    @RequestMapping("querybook.do")
    public ModelAndView querybook(Integer bookId){
        //查看在Redis中是否有该书籍的信息
        Jedis jedis=new Jedis();
        Book book=jedis.get(bookId.toString());
        if(book!=null){
        //直接把Redis读取的数据返回
            return book;
        }else{
        //从数据库中读取数据
            book=Database.query(bookId);
        //将数据存储到Redis中
            jedis.set("book".getBytes(),SerializeUtil.serialize(book));
        //将数据返回
            return book;
        }
    }
这里笔者再总结一下,就是在用户请求的时候,首先查看Redis中是否有该数据(因为从Redis中取数据的速度比从关系型数据库中取要快得多),如果有就直接从Redis中取,如果没有就从数据库中取,然后再把取出来的数据放到Redis中,这样的话下次用户请求的时候就可以直接从Redis中读取数据了。
使用Redis作为中间缓存,会增加很多逻辑控制代码。比如使用Oracle作为关系型数据库,Redis作为中间缓存,那么Oracle和Redis的数据是不同步的,这时候对用户的一些基本操作(增、删、改、查)就会添加很多控制代码,以保证Oracle和Redis中的数据一致性。
【Redis】解析Redis和Java传递数据的更多相关文章
- Android NDK 开发(四)java传递数据到C【转】
		转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ... 
- [置顶] JNI之java传递数据给c语言
		1.首先创建 DataProvider类: package com.pl.ndkpassdata; public class DataProvider { static{ System.loadLib ... 
- Android使用JNI实现Java与C之间传递数据(转)
		介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需 ... 
- Android使用JNI实现Java与C之间传递数据
		介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需要 ... 
- Activity通过bundle传递数据
		从AActivity.java向BActivity.java传递数据: 建立AActivity.java文件建立bundle: 1 public class AActivity extends App ... 
- Java server数据之(4):Redis鸟瞰
		Redis简介 Redis是NoSQL数据库中的一种,属于key-value键值对这一个子类别. 它常被称作是一款数据结构服务器(data structure server). Redis中的数据结构 ... 
- redis 模拟jedis 操作string类型数据
		一.思路分析 redis数据传输遵循resp协议,只需要按照resp协议并通过socket传递数据到redis服务器即可 resp数据格式: 二.具体实现 package com.ahd.jedis; ... 
- redis bitmap数据结构之java对等操作
		在之前的文章中,我们有说过bitmap,bitmap在很多场景可以应用,比如黑白名单,快速判定,登录情况等等.总之,bitmap是以其高性能出名.其基本原理是一位存储一个标识,其他衍生知道咱就不说了, ... 
- Java Spring mvc 操作 Redis 及 Redis 集群
		本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ... 
随机推荐
- Flask传递中文URL时的问题
			在非IE浏览器上都很好,几乎不用处理,但IE不行,学习了半天,有以下要点: 1.Meta如果设置了编码,如UTF8,浏览器都将中文转码发送,但IE不会! <meta http-equiv=&qu ... 
- ZH奶酪:Python按行读取文件
			1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ... 
- 解决工作中遇到的一个"打开,保存"文件框的bug的过程
			工作中遇到的这个问题还是很有意思的.其中嵌套了很多奇葩性的问题. (转载请指明出于breaksoftware的csdn博客) 我们来看下故事的发生过程,QA同学发现我们存在如下的bug 看到如此多的串 ... 
- 第七周 Word文档修订
			come from:http://www.sxszjzx.com/~c20/12-2/office-gj/ 第七周 Word文档修订 教学时间 2013-4-8 教学课时 2 教案序号 12 教学目标 ... 
- 共享权限ACL列表出现SID现象
			http://www.minasi.com/forum/topic.asp?TOPIC_ID=16842 Basically here's what happens, and why it doesn ... 
- Java中创建访问HTTPS的自签名证书的方法
			一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随 ... 
- spring boot-mybatis全注解化(3)
			pom.xml <!-- 引入mybatis --> <dependency> <groupId>org.mybatis.spring.boot</group ... 
- Maven进行Mahout编程,使其兼容Hadoop2.2.0环境运行 (转)
			http://blog.csdn.net/u010967382/article/details/39209329 http://blog.csdn.net/fansy1990/article/deta ... 
- 用pyenv和virtualenv搭建单机多版本python虚拟开发环境
			作为主流开发语言, 用python 开发的程序越来越多. 方便的是大多linux系统里面都默认集成了python, 开发可以随时随地开始. 但有时候这也成为了一个短板, 比如说有时候我们需要开发和调试 ... 
- 〖Linux〗Shell十进制数值转换十六进制
			dec2hex(){ printf } a=$(dec2hex ) echo $a 
