Redis&Jedis_案例

案例需求:

    1. 提供index.html页面,页面中有一个下拉列表,里面存储的是一些爱好选项
     2. 当页面加载完成后,发送ajax请求,加载所有爱好到这个下拉列表里面

1. 创建数据库,并且创建表,在其中存储爱好的一些选项

CREATE DATABASE hobby; -- 创建数据库
USE hobby; 			   -- 使用数据库
CREATE TABLE hobbys(   -- 创建表
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20) NOT NULL
	
);
-- 插入数据
INSERT INTO hobbys VALUES(NULL,'篮球');
INSERT INTO hobbys VALUES(NULL,'足球');
INSERT INTO hobbys VALUES(NULL,'乒乓球');
INSERT INTO hobbys VALUES(NULL,'电影');

2. 项目结构图如下

druid.properties是配置数据库方面的连接参数

jedis.properties是配置redis缓存的连接参数


没有使用redis缓存的方式,每次都得查数据库,用户体验不好

package zr.web.servlet;

import zr.service.HobbyService;
import zr.service.Impl.HobbyServiceImpl;

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("/findHobbyServlet")
public class FindHobbyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 调用service查询
        HobbyService service=new HobbyServiceImpl();
        List<Hobby> hobbyList = service.findAll();

        // 将数据类型转化为json
        ObjectMapper mapper=new ObjectMapper();
        String hobbys = mapper.writeValueAsString(hobbyList);
        System.out.println(hobbys);
        // 将结果响应回原来页面
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(hobbys);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在service层调用dao层的函数,在dao层调用JdbcTemplate对象,调用其查询方法,将查询结果的List集合返回,在FindHobbyServlet里面调用ObjectMapper对象的方法,将list转化为字符串,然后将返回的字符串写出到输出流中


使用redis缓存,只需要第一次查询数据库,将返回的list集合转化为String类型,然后将该字符串存入到redis数据库中,然后返回这个字符串,再次访问时直接从redis数据库获取即可

package zr.web.servlet;

import zr.service.HobbyService;
import zr.service.Impl.HobbyServiceImpl;

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("/findHobbyServlet")
public class FindHobbyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 调用service查询
      
        HobbyService service=new HobbyServiceImpl();
        String hobbys = service.findJson();
        System.out.println(hobbys);
        // 将结果响应回原来页面
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(hobbys);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在service层

    @Override
    public String findJson() {
        // 先从redis中查询数据
        //获取redis连接
        Jedis jedis = JedisPoolUtils.getJedis();
        String hobby = jedis.get("hobby");
        // 判断hobby数据是否为null
        if (hobby==null||hobby.length()==0){
            // redis没有数据,应该从数据库里面查询
            List<Hobby> list = dao.findAll();
            // 将list序列化为json
            ObjectMapper mapper = new ObjectMapper();
            try {
                hobby = mapper.writeValueAsString(list);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //将json数据存入redis中
            jedis.set("hobby",hobby);
            jedis.close();
        }
        return hobby;
    }

在test.jsp页面直接通过jquery获取json,将其每一个值追加到select选择框即可

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        $(function () {
            // 发送ajax请求,加载所有省份数据
            $.get("findHobbyServlet",{},function (data) {
                // 查询findHobbyServlet的输出json为
                // [{"id":1,"name":"篮球"},{"id":2,"name":"足球"},{"id":3,"name":"乒乓球"},{"id":4,"name":"电影"}]

                // 获取select
                var hobbys=$("#hobbys");
                // 遍历json
                $(data).each(function () {
                   // 创建option
                   var option="<option name='"+this.id+"'>"+this.name+"</option>";
                   // 调用select的append追加option
                    hobbys.append(option);
                });



            });
        });
    </script>
</head>
<body>
    <select id="hobbys">
        <option>/选择</option>

    </select>
</body>
</html>

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

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

        1. 数据库表如果执行增删该的相关操作,则需要将redis的缓存数据再次存入

        2. 如果不注意这方面的问题的话,会出现数据库表数据发生变化,但是本地的缓存却没有发生变化,这样导致数据错误

        3. 在service对应的增删改方法中,将redis数据删除
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值