Redis常见的应用场景---查询所有省份案例

-----Redis解决查询的性能问题

  • 需求:访问index.jsp页面,使用ajax请求加载省份列表,用户第一次访问数据库获取,以后都从redis里面获取。

 Redis常见的应用场景---查询所有省份案例

  •  数据库表province

Redis常见的应用场景---查询所有省份案例

  •  写入测试数据

INSERT INTO province(pid,pname) VALUES(1,'广东省'),(2,'湖南省'),(3,'吉林省'),(4,'广西省');

Redis常见的应用场景---查询所有省份案例

  •  需要导入的内容:

 Redis常见的应用场景---查询所有省份案例

 Redis常见的应用场景---查询所有省份案例

  • 分析

  • 代码结构:

 jedis.properties

#最大连接数
maxTotal=100
#用户超时时间
maxWaitMillis=30000
#redis服务器地址
host=localhost
#端口号
port=6379

druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=root
initialSize=5
maxActive=10
maxWait=30000
maxIdle=8
minIdle=3

 工具类:CharacterFilter、JDBCUtils、JedisUtil

package com.sunny.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 解决全站乱码问题,处理所有的请求
 */
@WebFilter("/*")
public class CharchaterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
        //将父接口转为子接口
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) rep;
        //获取请求方法
        String method = request.getMethod();
        //解决post请求中文数据乱码问题
        if(method.equalsIgnoreCase("post")){
            request.setCharacterEncoding("utf-8");
        }
        //处理响应乱码
        response.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}
package com.sunny.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.util.JdbcUtils;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

//JDBC的工具类
public class JDBCUtils {

    private static DataSource dataSource;

    static{
        try {
            Properties properties = new Properties();
            properties.load(JdbcUtils.class.getResourceAsStream("/druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //对外提供连接池
    public static DataSource getDataSource(){
        return dataSource;
    }




    //获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }


    //关闭资源
    public static void  close(Connection con, Statement st , ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }




    }

}
package com.sunny.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

public class JedisUtil {

    private static JedisPool jedisPool;

    //静态代码块初始化
    static{
        //读取jedis.properties配置文件解析里面的数据
        //ResourceBundle,专门用于解析properties文件,可以根据文件的名字就可以解析文件
        ResourceBundle resourceBundle = ResourceBundle.getBundle("jedis");//会自动读取类路径里面的文件
        //读取里面的数据
        int maxTotal = Integer.parseInt(resourceBundle.getString("maxTotal"));
        int maxWaitMillis = Integer.parseInt(resourceBundle.getString("maxWaitMillis"));
        String host = resourceBundle.getString("host");
        int port = Integer.parseInt(resourceBundle.getString("port"));

        //创建配置对象
        JedisPoolConfig config= new JedisPoolConfig();
        config.setMaxTotal(maxTotal);//最大连接数
        config.setMaxWaitMillis(maxWaitMillis);//用户最大等待超时时间,单位毫秒数
        //创建连接池对象
        //public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port)
        jedisPool = new JedisPool(config,host,port);
    }
    //方便用户获取一个连接对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
  • index.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>$Title$</title>
</head>
<body>
省份列表:
<select id="province">
  <option>=请选择=</option>
</select>
<%--导入jquery--%>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    //发送异步ajax请求
    $.ajax({
        url:"SearchProviceListServlet",
        dataType:"json",
        type:"post",
        success:function (json) {
            //json=[{pid=xx,pname=xx},{pid=xx,pname=xx},...]
            if(json.length>0){
                //遍历数据,更新到页面上
                $(json).each(function (i,province) {
                    //将每个省份数据添加到下拉框中
                    var pid= province.pid;
                    var pname = province.pname;
                    $("#province").append("<option value='"+pid+"'>"+pname+"</option>");
                });
            }
        },
        error:function () {
            alert("服务器忙。。。");
        }
    });
</script>
</body>
</html>
package com.sunny.web;

import com.sunny.service.ProvinceService;

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(name = "SearchProvinceListServlet", urlPatterns = "/SearchProviceListServlet")
public class SearchProvinceListServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    //实例业务
    private ProvinceService provinceService = new ProvinceService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            //1.调用业务获取省份列表数据(返回字符串)
            String jsonData =provinceService.findAllProvince();
            //2.返回给前端
            response.getWriter().write(jsonData);
        } catch (Exception e) {
            e.printStackTrace();

        }
    }
}
package com.sunny.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sunny.Dao.ProvinceDao;
import com.sunny.model.Province;
import com.sunny.utils.JedisUtil;
import redis.clients.jedis.Jedis;

import java.util.List;

public class ProvinceService {

    //实例dao层
    private ProvinceDao provinceDao = new ProvinceDao();

    /**
     * 获取省份列表json数据
     * @return String
     */
    public String findAllProvince()throws Exception {
        //1.从redis里面获取json数据
        //获取jedis连接对象
        Jedis jedis = JedisUtil.getJedis();
        //获取json
        String jsonData = jedis.get("provinceList");
        //2.判断json数据有效性
        if(jsonData==null) {
            //2.1 如果json为空,去数据库获取省份列表数据List集合
            List<Province> provinceList =  provinceDao.findAllProvince();
            //2.2 判断List集合是否为空,不为空转换为json
            if(provinceList!=null && provinceList.size()>0) {
                jsonData = new ObjectMapper().writeValueAsString(provinceList);
                //2.3 将json写入redis
                jedis.set("provinceList",jsonData);
            }
        }
        jedis.close();//关闭连接,返回连接池
        //3.返回json
        return jsonData;
    }
}
package com.sunny.Dao;

import com.sunny.model.Province;
import com.sunny.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.SQLException;
import java.util.List;

public class ProvinceDao {

    private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());

    /**
     * 获取数据库省份列表
     * @return List<Province>
     * @throws SQLException
     */
    public List<Province> findAllProvince()throws SQLException {
        String sql="select * from province";
        return jdbcTemplate.query(sql,new BeanPropertyRowMapper<Province>(Province.class));
    }
}
package com.sunny.model;

public class Province {

    private  int pid;
    private String pname;

    public Province(){}
    public Province(int pid, String pname) {
        this.pid = pid;
        this.pname = pname;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }
}