在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 + "]"; } }
(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 + "]"; } }
工具类的方法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; } } }
(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中的数据一致性。