使用redis缓存数据
在service层,添加以下代码,先理解,后照搬,
如果我写的有点让你不理解,私聊我,我们一起探讨,本人乐于接受所有疑问。
import cn.hp.jedis.dao.ProvinceDao;
import cn.hp.jedis.dao.ProvinceDaoImpl;
import cn.hp.jedis.domain.Province;
import cn.hp.jedis.utils.JedisPoolUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import redis.clients.jedis.Jedis;
import java.util.List;
public class ProvinceServiceImpl implements ProvinceService {
//调用dao层
private ProvinceDao provinceDao = new ProvinceDaoImpl();
/**
*从数据库查询数据
*/
@Override
public List<Province> findAll() {
return provinceDao.findAll();
}
/**
*添加到redis缓存
*/
@Override
public String findJson() {
//1.从redis取出数据(首先拿到jedis链接)
Jedis jedis = JedisPoolUtils.getJedis(); //下面有JedisPoolUtils工具类代码。链接一
//2.从jedis中得到 json数据
String json = jedis.get("province"); //从redis中查询是否缓存过数据
//3.判断json是否存在,若不存在 则先请求网络(将请求成功数据缓存到redis)
if (json == null||json.length()==0){
System.out.println("首次从mysql查询数据,redis没有缓存。。。");
//3.1先从mysql数据库查询数据
List<Province> list = provinceDao.findAll(); //从数据库查询数据并存入List集合中
ObjectMapper objectMapper = new ObjectMapper(); //List转json数据 具体看链接二
try {
json = objectMapper.writeValueAsString(list); //List转json数据 具体看链接二
} catch (JsonProcessingException e) {
e.printStackTrace();
}
jedis.set("province",json); //向redis中添加缓存数据
jedis.close(); //关闭池链接
}else{
System.out.println("可以取出json数据,使用缓存数据...");
}
return json;
}
}
servlet层调用
import cn.hp.jedis.service.ProvinceService;
import cn.hp.jedis.service.ProvinceServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ProvinceServlet extends HttpServlet {
//调用上面的service层
private ProvinceService provinceService = new ProvinceServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String json = provinceService.findJson(); //调用service的findJson() 方法
System.out.println(json);
//将json数据响应到前台 (html,jsp)
resp.setContentType("application/json;charset=utf-8");//指定当前响应数据的格式为json 并且指定编码为utf-8
resp.getWriter().write(json);//直接将字符串响应到客户端
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
spring和redis的配置文件(spring-redis.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--Jedis连接池的相关配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--新版是maxTotal,旧版是maxActive-->
<property name="maxTotal">
<value>200</value>
</property>
<property name="maxIdle">
<value>50</value>
</property>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="ip地址" />
<constructor-arg name="port" value="6379" type="int" />
<constructor-arg name="timeout" value="30000" type="int" />
</bean>
</beans>
redis属性配置文件(redis.properties)
#redis.host=127.0.0.1
redis.host=localhost
redis.port=6379
redis.password=你的redis密码
redis.maxIdle=50
redis.maxTotal=100
redis.maxWaitMillis=3000
redis.testOnBorrow=true
redis.timeout=5000