Redis缓存优化mysql小案例

Redis案例

    • 一、案例需求
    • 二、架构
    • 三、代码实现
    • 四、结果

一、案例需求

  • 一个页面,页面中有一个省份 下拉列表 当 页面加载完成后 发送ajax请求,加载所有省份

  • 注意:使用redis缓存一些不经常发生变化的数据。

    • 数据库的数据一旦发生改变,则需要更新缓存。
      • 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
      • 在service层对应的增删改方法中,将redis数据删除。

二、架构

MVC三层架构

三、代码实现

  1. 需要的添加依赖/技术:

Jquery框架(Ajax)+Jackson的fastjson+测试junit+Redis缓存+Servlet+Spring的JdbcTemplate相关+druid数据库连接池+mysql数据库

  <dependency>
      <!--Jquery 相关包-->
      <groupId>org.webjars</groupId>
      <artifactId>jquery</artifactId>
      <version>3.3.1</version>
    </dependency>

    <!--添加fastjson包-->
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>3.0.1</version>
    </dependency>
    <!--日志管理-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.2</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>

    <!--Spring 相关的jar包 用于 JdbcTemplate-->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <!--阿里的druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.21</version>
    </dependency>

    <!--mysql连接-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
    </dependency>

  1. 前端显示页面:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="webjars/jquery/3.3.1/jquery.min.js"> </script>
    <script>
        $(function () {
            $("#hello").css("backgroundColor","red");
            $.get("findProvinceServlet",{},function (data) {
                //1.获取到select标签
                var $province = $("#province");
                //2.遍历data传来的json数据
                $(data).each(function () {
                    //3.设置option
                    var option = " +this.name+" "
                    //4.append添加到select
                    $province.append(option);
                })
            });
        });
    </script>
</head>
<body>

<input type="button" value="hello" id="hello" ><br>
<select id="province">
    <option>--请选择省份--</option>
</select>

</body>
</html>
  1. FindProvinceServlet 前端和后端的交互
package service.Impl;

import Dao.Impl.ProvinceDao;
import Dao.ProvinceDaoImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import domain.Province;
import itcase.JedisPoolUtils;
import redis.clients.jedis.Jedis;
import service.ProvinceService;

import java.util.List;

public class ProvinceServiceImpl implements ProvinceService {

    ProvinceDao dao = new ProvinceDaoImpl();

    @Override
    public List<Province> findAll() {
        return dao.FindAll();
    }

    /**
     * Redis缓存
     * @return 返回json数据
     */
    @Override
    public String findAllJson() {
        //1.使用Jackson工具类得到Jedis
        Jedis jedis = JedisPoolUtils.getJedis();
        //2.查询key province
        String province_json = jedis.get("province");
        if (province_json == null || province_json.length()==0){
            //3.province 为空说明第一次此访问,所以设置province并存储
            List<Province> list = dao.FindAll();
            //4.将list转为Json
            ObjectMapper mapper = new ObjectMapper();
            try {
                province_json= mapper.writeValueAsString(list);
                System.out.println("第一次缓存:"+province_json);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //5.将json存储到Redis
            jedis.set("province",province_json);
            //6.归还连接
            jedis.close();
        }else{
            System.out.println("从缓存中取出数据");
        }

        return province_json;
    }
}

  1. Service层方法进行判断缓存和调用Dao层方法进行数据存储
 /**
     * Redis缓存
     * @return 返回json数据
     */
    @Override
    public String findAllJson() {
        //1.使用Jackson工具类得到Jedis
        Jedis jedis = JedisPoolUtils.getJedis();
        //2.查询key province
        String province_json = jedis.get("province");
        if (province_json == null || province_json.length()==0){
            //3.province 为空说明第一次此访问,所以设置province并存储
            List<Province> list = dao.FindAll();
            //4.将list转为Json
            ObjectMapper mapper = new ObjectMapper();
            try {
                province_json= mapper.writeValueAsString(list);
                System.out.println("第一次缓存:"+province_json);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //5.将json存储到Redis
            jedis.set("province",province_json);
            //6.归还连接
            jedis.close();
        }else{
            System.out.println("从缓存中取出数据");
        }

        return province_json;
    }
  1. Dao层进行数据查询返回
    @Override
    public List<Province> FindAll() {
        String sql = "select * from province";
        List<Province> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
        return query;
    }

四、结果

Redis缓存优化mysql小案例_第1张图片

你可能感兴趣的:(Redis,Java,redis,mysql,ajax)