在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传递数据的更多相关文章

  1. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  2. [置顶] JNI之java传递数据给c语言

    1.首先创建 DataProvider类: package com.pl.ndkpassdata; public class DataProvider { static{ System.loadLib ...

  3. Android使用JNI实现Java与C之间传递数据(转)

    介绍Java如何将数据传递给C和C回调Java的方法.  java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需 ...

  4. Android使用JNI实现Java与C之间传递数据

    介绍Java如何将数据传递给C和C回调Java的方法. java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java.C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需要 ...

  5. Activity通过bundle传递数据

    从AActivity.java向BActivity.java传递数据: 建立AActivity.java文件建立bundle: 1 public class AActivity extends App ...

  6. Java server数据之(4):Redis鸟瞰

    Redis简介 Redis是NoSQL数据库中的一种,属于key-value键值对这一个子类别. 它常被称作是一款数据结构服务器(data structure server). Redis中的数据结构 ...

  7. redis 模拟jedis 操作string类型数据

    一.思路分析 redis数据传输遵循resp协议,只需要按照resp协议并通过socket传递数据到redis服务器即可 resp数据格式: 二.具体实现 package com.ahd.jedis; ...

  8. redis bitmap数据结构之java对等操作

    在之前的文章中,我们有说过bitmap,bitmap在很多场景可以应用,比如黑白名单,快速判定,登录情况等等.总之,bitmap是以其高性能出名.其基本原理是一位存储一个标识,其他衍生知道咱就不说了, ...

  9. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

随机推荐

  1. Docker实战之创建一个tomcat容器

    一.Docker与虚拟机的区别 二.Docker学习步骤 2.1:安装宿主操作系统 在VMVare中安装了Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic ...

  2. 关于Spring mvc 一次请求Controller执行两次的问题

    资源路径为空时也会导致重复请求.< span style="background-image:url('');" >相关推荐< /span >,此时就会出现 ...

  3. javascript中的关联数组

    所谓关联数组(associative array), 就是指javascript中的对象. 因为javascript中的属性就是一个个的键值对,可以通过obj[attr]的方式访问,很类似数组. 这种 ...

  4. Python脚本生成sitemap

    项目须要用脚本生成sitemap,中间学习了一下sitemap的格式和lxml库的使用方法.把结果记录一下,方便以后须要直接拿来用. 来自Python脚本生成sitemap 安装lxml 首先须要pi ...

  5. asp.net使用include包含文件

    么?用asp.net使用include包含文件?……有必要吗?使用“用户控件”不是更好吗? 当然,绝大多数情况下,用户控件都能解决问题.但若要在用户控件中需包含其他公用块,即使用用户控件嵌套,老是出问 ...

  6. MACD底背离选股公式——通达信、同花顺

    {底背离,通达信版.同花顺版} DIFF:=EMA(CLOSE,) - EMA(CLOSE,); DEA:=EMA(DIFF,); MACD:=*(DIFF-DEA); QZQ:=BARSLAST(R ...

  7. mysql如何分类统计数量

    比如我表test里面有id,mc,xh三个字段(分别是自动编号,钢材名称(若干种),钢材型号(大号,中号,小号)) id mc xh 钢管 大号 铜管 大号 铁管 小号 铝管 中号 钢管 小号 我现在 ...

  8. 【leetcode】solution in java——Easy3

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412505.html 心得:看到一道题,优先往栈,队列,map,list这些工具的使用上面想.不要来去都是暴搜 ...

  9. java 生成GUID与UUID

      java 生成GUID与UUID CreateTime--2018年5月31日16点29分 Author:Marydon import java.util.UUID; public static ...

  10. oracle 如何查看oracle数据库版本

      select * from v$version 写在最后 哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!! 相关推荐: 个人主页 oracle专题