Redis数据库初步学习3 - 案例

3 篇文章 0 订阅
3 篇文章 0 订阅


使用 Redis 缓存 mysql 数据库的数据,并将这些数据反映到页面的下拉框中。

1. 案例

1.1 要求

  1. 提供 index.html 页面,页面中有一个省份 - 下拉菜单
  2. 当页面加载完成之后,发送 ajax 请求,加载所有的省份

1.2 分析

​ 首先创建一个 html 页面,这个页面有一个下拉框。当我们点击下拉框的时候,使用 jQuery 中的 ajax 方法发送一个请求到后台,以获取所有的省份数据

$(function() {
    $.get("url", [], function(data) {
        // 填充到省份列表中
    });
});

​ 我们查询数据的时候,有三层:findProvinceServlet、ProvinceService、ProvinceDao

在这里插入图片描述

​ 我们通过 ProvinceService 查询的数据需要一层一层的返回,具体由上图所示。

1.3 代码块

以下是包的层级和拥有的类:
在这里插入图片描述

其中,util 是工具包,里面还有 JDBCUtils 数据库连接工具类 和 JedisPoolUtils 连接 redis 数据库连接池工具类。

domain中是实体类。里面对应数据库中的 province 表。

ProvinceDao 和 ProvinceDaoImpl用于实现数据库的查询。

ProvinceService 和 ProvinceServiceImp 用于 接受数据库中查询的数据并对数据做出一定的处理。

ProvinceServlet 用于接受前台传来的申请并返回数据。

src 文件夹下的 druid.properties 和 jedis.properites 用于存放属性。

首先,引入以下包:

在这里插入图片描述

druid.properties:

driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/day23?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true
username = root
password = root
initialSize = 5
maxActive = 10
maxWait = 3000

jedis.properties:

host = 127.0.0.1
port = 6379
maxTotal = 50
maxIdle = 10

domaim.Province:

public class Province {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Province{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

util.JDBCUtils:

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCUtils {

    private static DataSource ds;

    static {
        try {
            // 1. 加载配置文件
            Properties pro = new Properties();
            // 使用 ClassLoader 加载配置文件
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(is);

            // 2. 初始化连接池对象
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接对象
     */
    public static DataSource getDataSource() {return ds;}

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

uitl.JedisPoolUtils:

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

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class JedisPoolUtils {

    private static JedisPool jedisPool;

    static {
        // 读取配置
        InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        // 创建一个 Properties 对象
        Properties pro = new Properties();
        // 关联文件
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 获取数据,设置到 JedisPoolConfig 中
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
        // 初始化 JedisPool
        jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
    }

    /**
     * 获取连接方法
     */

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

}

dao.ProvinceDao:

import cn.itcast.domain.Province;

import java.util.List;

public interface ProvinceDao {

    public List<Province> findALl();
}

dao.impl.ProvinceDaoImpl:

import cn.itcast.dao.ProvinceDao;
import cn.itcast.domain.Province;
import cn.itcast.util.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class ProvinceDaoImpl implements ProvinceDao {

    // 1. 声明一个成员变量
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public List<Province> findALl() {
        // 1. 定义sql
        String sql = "select * from province";
        // 2. 执行sql
        List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
        return list;
    }


    @Test
    public void test() {
        // 1. 定义sql
        String sql = "select * from province";
        // 2. 执行sql
        List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
        for(Province province : list) {
            System.out.println(province);
        }
    }
}

service.ProvinceService:

import cn.itcast.domain.Province;

import java.util.List;

public interface ProvinceService {

    List<Province> findAll();
    String findAllJson();
}

service.impl.ProvinceServiceImpl:

import cn.itcast.dao.ProvinceDao;
import cn.itcast.dao.impl.ProvinceDaoImpl;
import cn.itcast.domain.Province;
import cn.itcast.service.ProvinceService;
import cn.itcast.util.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 dao = new ProvinceDaoImpl();

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

    /**
     * 使用redis缓存
     */
    @Override
    public String findAllJson() {
        // 先从 redis 中查询数据
        Jedis jedis = JedisPoolUtils.getJedis();
        String province_json = jedis.get("province");

        // 2. 判断 province_json 数据是否为 null
        if (province_json == null || province_json.length() == 0) {
            // redis 没有数据
            System.out.println("redis 中没有数据,查询数据库");
            // 从数据中查询
            List<Province> ps = dao.findALl();
            // 将 list 序列化为 json
            ObjectMapper mapper = new ObjectMapper();
            try {
                province_json = mapper.writeValueAsString(ps);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }

            // 将 json 数组存入 redis 中
            jedis.set("province",province_json);
            // 归还连接
            jedis.close();
        }else {
            System.out.println("redis 中有数据,查询缓存...");
        }
        return province_json;
    }
}

web.servlet.ProvinceServlet:

import cn.itcast.domain.Province;
import cn.itcast.service.ProvinceService;
import cn.itcast.service.impl.ProvinceServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

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;
import java.util.List;

@WebServlet(name = "ProvinceServlet", urlPatterns = "/provinceServlet")
public class ProvinceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

   /* @Test
    public void test() {
        ProvinceService service = new ProvinceServiceImpl();
        List<Province> list = service.findAll();
        ObjectMapper objectMapper = new ObjectMapper();
        String json = null;
        try {
            json = objectMapper.writeValueAsString(list);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        System.out.println(json);
    }*/

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json;charset=utf-8");
        // 1. 调用 service 查询
        ProvinceService service = new ProvinceServiceImpl();
        // 2. 序列化list为json
        String json = service.findAllJson();
        // 3. 响应结果
        response.getWriter().write(json);
    }
}

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.4.1.min.js"></script>
    <script>
        $(function () {
            // 发送 ajax 请求,加载所有省份的数据
            $.get("provinceServlet", {}, function (data) {
                // 1. 获取 select
                var province = $("#province");
                // 2.遍历 json 数组
                $(data).each(function () {
                    // 3. 创建 <option>, 调用 select 的 append 追加 <option>
                    var option = "<option name = '" + this.id + "'>" + this.name + "</option>";
                    // 4. 追加
                    province.append(option);
                });

            });
        })
    </script>
</head>
<body>

<select id="province">
    <option>--请选择省份--</option>
</select>
</body>
</html>

1.4 注意点

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

​ 数据库的数据一旦发生改变,则需要更新缓存。

​ 数据库的表去执行了一些增删改的观想操作,需要将 redis 缓存数据清空再次存入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值