**
1、导包
**
1-SSM(spring+mybatis+SpringMVC)的jar包
2-Redis连接的jar包
3-然后json和其他相关jar包,(这里用的json jar包不是阿里巴巴的)
2、添加工具类redisUtil
package util;
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;
// 判断Redis中是否存在键
public boolean existsKey(String key) {
Jedis jedis = pool.getResource();
boolean bool;
try {
bool = jedis.exists(key);
} finally {
jedis.close();
}
return bool;
}
// 把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> classz) {
Jedis jedis = pool.getResource();
try {
String str = jedis.get(key);
JSONArray array = JSONArray.fromObject(str);
// 把字符串转换回集合对象 clazz是指定的类型
return (List<T>) array.toCollection(array, classz);
} finally {
jedis.close();
}
}
//第二种方法
// 取缓存中的二进制数据,反序列化成List集合对象
/*
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();
}
}*/
}
这里有两种方式,二进制和json的
3、添加配置
在一个applicationContext.xml文件中添加(要注意添加扫描util包)
<context:component-scan base-package="util" />
<!-- 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>
4、在contorller类里面运用
package controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import entity.Grade;
import redis.clients.jedis.JedisPool;
import service.GradeService;
import util.RedisUtil;
/**
* 年级的控制类
* @author yjl
*
*/
@Controller
@RequestMapping("/grade")
public class GradeController {
@Autowired // 从IOC容器注入业务层对象
GradeService service;
@Autowired
JedisPool pool;
@Autowired
RedisUtil redisUtil;
@RequestMapping("/list")
public ModelAndView list() {
List<Grade> grades = null;
if (redisUtil.existsKey("gr")) {
System.out.println("从Redis 缓存中取数据..");
//调用反序列化方法取缓存的数据 --二进制
//grades = redisUtil.getObject("gr",Grade.class);
//调用Json格式转换的方法取缓存数据
grades = redisUtil.getJsonArray("gr", Grade.class);
} else {
System.out.println("从数据库中取数据,并存入缓存..");
//调用底层方法从数据库中取数据
grades = service.find();
//调用序列化方法把数据缓存到Redis中 --二进制
//redisUtil.saveObject(grades, "gr");
//调用Json格式化方法把数据缓存到Redis中
redisUtil.saveJsonArray(grades, "gr");
}
return new ModelAndView("gradeList", "grades", grades);
}
}
如果redis数据库里面没有这个gr的值,他会从数据库里面拿,然后缓存到redis数据库中,有gr值的话,就直接在redis中拿取数据。
主意事项:(有的是我自己写这个是犯的一些错误,还有同学犯的一些错误)
- web文件里面的项目名字(因为一般web.xml文件都是直接复制的,所以开头的项目名字记得要改)
- 写util类时,例如:redisUtil类,要加@Component注解
- 页面的<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>指令不要忘记加,一般要用jstl方式的多多少少这个忘记加过
- 应用jar包时,要注意不要导入其他的jar包的方法(因为有很多其他jar包也有这个方法)