这段时间一直有人问如何在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 |
在配置文件中配置JedisPool 连接池对象
-
<!-- Redis 连接池配置 -->
-
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
-
destroy-method=
"close">
-
<constructor-arg name="host" value="127.0.0.1" />
-
<constructor-arg name="port" value="6379" />
-
</bean>
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 <T> List<T> getObject(String key, Class<T> 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<T>) 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>这个T所指定的类型
-
@SuppressWarnings({ "static-access", "unchecked" })
-
public <T> List<T> getJsonArray(String key, Class<T> clazz) {
-
Jedis jedis = pool.getResource();
-
try {
-
String str = jedis.
get(key);
-
JSONArray array = JSONArray.fromObject(str);
-
// 把字符串转换回集合对象 clazz是指定的类型
-
return (List<T>) 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;
-
-
@RequestMapping("list")
//注册URL
-
public ModelAndView list() {
-
List<Grade> 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);
-
}
-
}
写到此,希望对大家有所帮助。