案例需求:
1. 提供index.html页面,页面中有一个省份 下拉列表
2. 当 页面加载完成后 发送ajax请求,加载所有省份
3. 注意:使用redis缓存省份数据
使用redis缓存一些不经常发生变化的数据。
redis是一个非关系型数据库,工作在内存中也就是缓存中,它的持久化需要修改配置文件,否则一旦你的redis服务器关闭数据就无法保存
但做一个需求,发现如果数据的值变化那怎么实现缓存呢????
发现redis时要注意一下几个点
1.redis使用时必须将redis的服务器打开
2.redis实现缓存只是在你项目跑起来时可以更加快速访问,一但你的服务器关闭,那么数据也没有保存,下次还是要先在mysql中获得数据后存到redis中来实现一个缓存****
.redis实现缓存只是在你项目跑起来时可以更加快速访问,一但你的服务器关闭,那么数据也没有保存,下次还是要先在mysql中获得数据后存到redis中来实现一个缓存**
3,本项目中是把所有数据封装成一个string,然后赋值给key值这样不会出现值得变化
1.首先是省份的前端页面pro.jsp
<%-- Created by IntelliJ IDEA. User: My Date: 2021/1/19 Time: 22:29 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <script src="js/jquery-3.3.1.min.js"></script> <script> //设置下拉列表里面的内容 //首先用的的一般是Jquery的get方法 $(function () { //异步ajax获取数据库中的省份的数据,天在里面 //用jquery的get方法 $.get("proservlet",{},function (data) { //执行回调函数 //获取下拉列表 var pro = $("#pro"); //设置里面的内容 //遍历数组 $(data).each(function () { //json数据 //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}] //3.创建<option> var option = "<option name='"+this.id+"'>"+this.name+"</option>"; //4.调用select的append追加option pro.append(option); }); }); }); </script> <body> <select id="pro"> <option>----请选择省份---</option> </select> </body> </html>
2.是省份的servlet-----------proservlet.java
package web.servlet; import service.Impl.serviceimpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/proservlet") public class proservlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* //不用redis缓存的代码 //调用service方法来查询数据 serviceimpl service = new serviceimpl(); List<Province> provinceList = service.select(); //System.out.println(provinceList); //list转化成json ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(provinceList); // String json = mapper.writeValueAsString(provinceList); System.out.println(json); //通过resp返回 //设置返回类型为json类型 resp.setContentType("application/json;charset=utf-8"); resp.getWriter().write(json); */ //用redis的代码 serviceimpl service = new serviceimpl(); //返回的直接是 String useredis = service.useredis(); resp.setContentType("application/json;charset=utf-8"); resp.getWriter().write(useredis); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } }
3.是service层的实现类-----------serviceimpl.java
package service.Impl; import Dao.Impl.Daoimpl; import Dao.ProvinceDao; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import domain.Province; import domain.User; import redis.clients.jedis.Jedis; import service.Userservice; import util.jedispoolutils; import java.util.List; public class serviceimpl implements Userservice { private ProvinceDao provinceDao =new Daoimpl(); //调用dao层的方法 @Override public User register(String username) { return null; } //调用dao层的方法 @Override public List<Province> select() { return provinceDao.findAllpro(); } @Override public String useredis() { //用redis缓存来处置 //通过jedis连接池来连接redis Jedis jedis = jedispoolutils.getJedis(); String province = jedis.get("province"); //如果缓存中,没有数据,就从mysql中获取 if(province==null||province.length()==0){ //从dao层获得 System.out.println("redis中没有数据----查询数据库-------"); //将list序列化为json List<Province> provinceList = provinceDao.findAllpro(); ObjectMapper mapper = new ObjectMapper(); try { province = mapper.writeValueAsString(provinceList); } catch (JsonProcessingException e) { e.printStackTrace(); } //再把数据存入redis中 jedis.set("province",province); jedis.close(); }else { System.out.println("redis中有数据,查询缓存"); } return province; } }
4.dao层的实现类-------------------Daoimpl.java
package Dao.Impl; import Dao.ProvinceDao; import domain.Province; import domain.User; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import util.JDBCUtils; import java.util.List; public class Daoimpl implements ProvinceDao { //用redis数据库连接 //用redis连接池连接 //导入jar包 //通过连接池工具类获取jedis // Jedis jedis = jedispoolutils.getJedis(); //声明成员变量template //1.创建JdbcTemplate对象来连接数据库 private JdbcTemplate template= new JdbcTemplate(JDBCUtils.getDataSource()); //编写查询所有语句 @Override public User finduserbyname(String username) { return null; } @Override public List<Province> findAllpro() { //1.定义sql String sql = "select * from province "; //2.执行sql List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class)); return list; } /* //关闭连接 // jedis.close(); public User finduserbyname(String username){ //先设置数据库中username==tom //或者用命令的方式来设置也可以 // jedis.set("username","tom"); String name = jedis.get("username"); if(name!=null) { User user = new User(); user.setUsername(name); return user; } else { return null; } }*/ }