详解在Java程序中运用Redis缓存对象的方法
这段时间一直有人问如何在Redis中缓存Java中的List集合数据,其实很简单,常用的方式有两种:
1.利用序列化,把对象序列化成二进制格式,Redis提供了相关API方法存储二进制,取数据时再反序列化回来,转换成对象。
2.利用Json与java对象之间可以相互转换的方式进行存值和取值。
正面针对这两种方法,特意写了一个工具类,来实现数据的存取功能。
1.首页在Spring框架中配置 JedisPool连接池对象,此对象可以创建Redis的连接Jedis对象。当然,必须导入Redis的相关Jar包。
Jedis的Jar包如下:
commons-pool2-2.3.jar
jedis-2.9.0.jar
要用到Json,所以还需要导入Json的Jar包:
commons-beanutils-1.8.0.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.3.jar
ezmorph-1.0.6.jar
json-lib-2.3-jdk15.jar
在配置文件中配置JedisPool连接池对象
2.创建一个Redis的工具类RedisUtil,这个类中实现了上面所说的两种方法的存取操作
packagecom.sgxy.util;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.util.List;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
importnet.sf.json.JSONArray;
importredis.clients.jedis.Jedis;
importredis.clients.jedis.JedisPool;
@Component
publicclassRedisUtil{
@Autowired
JedisPoolpool;//Jedis连接池
//判断Redis中是否存在键
publicbooleanexistsKey(Stringkey){
Jedisjedis=pool.getResource();
booleanbool;
try{
bool=jedis.exists(key);
}finally{
jedis.close();
}
returnbool;
}
//取缓存中的二进制数据,反序列化成List集合对象
@SuppressWarnings("unchecked")
publicListgetObject(Stringkey,Classclazz){
Jedisjedis=pool.getResource();
//二进制IO输入流
ByteArrayInputStreamis=null;
ObjectInputStreamois=null;
try{
//从缓存中取二进制数据
byte[]b=jedis.get(key.getBytes());
is=newByteArrayInputStream(b);
ois=newObjectInputStream(is);
//把二进制转换成T指定类型的集合
return(List)ois.readObject();
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
is.close();
ois.close();
}catch(Exceptione2){
e2.printStackTrace();
}
jedis.close();
}
returnnull;
}
//把对象序列化二进制格式并保证到Redis缓存中
publicvoidsaveObject(Objectobject,Stringkey){
Jedisjedis=pool.getResource();
//二进制IO输出流
ByteArrayOutputStreamos=null;
ObjectOutputStreamoos=null;
try{
os=newByteArrayOutputStream();
oos=newObjectOutputStream(os);
oos.writeObject(object);//二进制数据
byte[]b=os.toByteArray();
//存入二进制数据到Redis缓存中
jedis.set(key.getBytes(),b);
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
os.close();
oos.close();
}catch(Exceptione2){
e2.printStackTrace();
}
jedis.close();
}
}
//把List集合对象转换成json格式保存到指定的键中
publicvoidsaveJsonArray(Objectobject,Stringkey){
Jedisjedis=pool.getResource();
try{
//格式化成Json字符串
JSONArrayarray=JSONArray.fromObject(object);
jedis.set(key,array.toString());//存入缓存
}finally{
jedis.close();
}
}
//通过键取出Json字符串并转换成Class这个T所指定的类型
@SuppressWarnings({"static-access","unchecked"})
publicListgetJsonArray(Stringkey,Classclazz){
Jedisjedis=pool.getResource();
try{
Stringstr=jedis.get(key);
JSONArrayarray=JSONArray.fromObject(str);
//把字符串转换回集合对象clazz是指定的类型
return(List)array.toCollection(array,clazz);
}finally{
jedis.close();
}
}
}
在Java程序其他地方操作这个工具类做数据的处理:
@Controller//注解这个类为控制器
@RequestMapping("grade")//注册访问此控制器的URL
publicclassGradeController{
@Autowired//从IOC容器注入业务层对象
GradeServicegradeService;
@Autowired
JedisPoolpool;
@Autowired
RedisUtilredisUtil;
@RequestMapping("list")//注册URL
publicModelAndViewlist(){
Listgrades=null;
if(redisUtil.existsKey("g")){
System.out.println("从Redis缓存中取数据..");
//调用反序列化方法取缓存的数据
grades=redisUtil.getObject("g",Grade.class);
//调用Json格式转换的方法取缓存数据
//grades=redisUtil.getJsonArray("gradeList",Grade.class);
}else{
System.out.println("从数据库中取数据,并存入缓存..");
//调用底层方法从数据库中取数据
grades=gradeService.find();
//调用序列化方法把数据缓存到Redis中
redisUtil.saveObject(grades,"g");
//调用Json格式化方法把数据缓存到Redis中
//redisUtil.saveJsonArray(grades,"gradeList");
}
returnnewModelAndView("gradeList","grades",grades);
}
}
写到此,希望对大家有所帮助。
以上所述是小编给大家介绍的在Java程序中运用Redis缓存对象的方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!