详解在Java程序中运用Redis缓存对象的方法

网友投稿 685 2023-01-10


详解在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 连接池对象

destroy-method="close">

destroy-method="close">

2. 创建一个Redis的工具类RedisUtil,这个类中实现了上面所说的两种方法的存取操作

package com.sgxy.util;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import net.sf.json.JSONArray;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

@Component

public class RedisUtil {

@Autowired

JedisPool pool; // Jedis连接池

// 判断Redis中是否存在键

public boolean existsKey(String key) {

Jedis jedis = pool.getResource();

boolean bool;

try {

bool = jedis.exists(key);

} finally {

jedis.close();

}

return bool;

}

// 取缓存中的二进制数据,反序列化成List集合对象

@SuppressWarnings("unchecked")

public List getObject(String key, Class clazz) {

Jedis jedis = pool.getResource();

// 二进制 IO 输入流

ByteArrayInputStream is = null;

ObjectInputStream ois = null;

try {

// 从缓存中取二进制数据

byte[] b = jedis.get(key.getBytes());

is = new ByteArrayInputStream(b);

ois = new ObjectInputStream(is);

// 把二进制转换成T指定类型的集合

return (List) ois.readObject();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

is.close();

ois.close();

} catch (Exception e2) {

e2.printStackTrace();

}

jedis.close();

}

return null;

}

// 把对象序列化二进制格式并保证到Redis缓存中

public void saveObject(Object object, String key) {

Jedis jedis = pool.getResource();

// 二进制 IO 输出流

ByteArrayOutputStream os = null;

ObjectOutputStream oos = null;

try {

os = new ByteArrayOutputStream();

oos = new ObjectOutputStream(os);

oos.writeObject(object); // 二进制数据

byte[] b = os.toByteArray();

// 存入二进制数据到Redis缓存中

jedis.set(key.getBytes(), b);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

os.close();

oos.close();

} catch (Exception e2) {

e2.printStackTrace();

}

jedis.close();

}

}

// 把List集合对象转换成json格式保存到指定的键中

public void saveJsonArray(Object object, String key) {

Jedis jedis = pool.getResource();

try {

// 格式化成Json字符串

JSONArray array = JSONArray.fromObject(object);

jedis.set(key, array.toString()); // 存入缓存

} finally {

jedis.close();

}

}

// 通过键取出Json字符串并转换成 Class这个T所指定的类型

@SuppressWarnings({ "static-access", "unchecked" })

public List getJsonArray(String key, Class clazz) {

Jedis jedis = pool.getResource();

try {

String str = jedis.get(key);

JSONArray array = JSONArray.fromObject(str);

// 把字符串转换回集合对象 clazz是指定的类型

return (List) array.toCollection(array, clazz);

} finally {

jedis.close();

}

}

}

在Java程序其他地方操作这个工具类做数据的处理:

@Controller //注解这个类为控制器

@RequestMapping("grade") //注册访问此控制器的URL

public class GradeController {

@Autowired // 从IOC容器注入业务层对象

GradeService gradeService;

@Autowired

JedisPool pool;

@Autowired

RedisUtil redisUtil;

@RequestMappireFWcng("list") //注册URL

public ModelAndView list() {

List grades = 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");

}

return new ModelAndView("gradeList", "grades", grades);

}

}

写到此,希望对大家有所帮助。

以上所述是给大家介绍的在Java程序中运用Redis缓存对象的方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开源的接口管理工具有哪些(接口管理平台 开源)
下一篇:可视化接口管理工具有哪些(可视化接口测试平台)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~