Redis缓存优化mysql小案例

5 篇文章 0 订阅

一、案例需求

  • 一个页面,页面中有一个省份 下拉列表 当 页面加载完成后 发送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 = " <option id='"+this.id+"'>"+this.name+"</option> "
                    //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;
    }

四、结果

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,作为AI语言模型,我无法提供实际的编程代码。但是,我可以提供一些关于使用RedisMySQL的数据同步的一般策略和概述。 在实现RedisMySQL数据同步的Spring Boot应用程序中,需要遵循以下步骤: 1. 使用Jedis客户端库(或Spring Data Redis)与Redis服务器建立连接,并关注适当的事件和事件处理程序,以便在Redis数据库中发生更改时通知应用程序。可以选择关注key的过期或更改事件,或者对于整个Redis数据库做出更改通知。 2. 在事件处理程序中,读取更改后的key或整个Redis数据库中的数据,并将它们写入到一个阻塞队列中,以便它们可以被异步处理。 3. 在另一个线程(例如使用Spring Boot的默认任务管理器)中,消费阻塞队列中的更改,并将其写入到MySQL数据库中。 4. 确定在MySQL中如何表示Redis数据。可以创建一个表,其中包含key和value列,以及一个时间戳列,该列表示更改是在何时发生的。这允许在MySQL数据库中存储Redis键值对,并在必要时检测并覆盖旧数据。如果Redis数据结构非常复杂,则可以使用JSON或BLOB字段。 5. 在写入MySQL数据库之后,可以根据需要执行其他操作,例如更新缓存或向其他服务发送通知。 因此,从Redis数据库中读取数据并将其写入MySQL数据库中的事务经过三个步骤: 1. 从Redis中读取数据。 2. 将数据写入MySQL。 3. 检查MySQL中是否存在Redis中的数据。如果是,则使用MySQL中的数据更新Redis。 总之,Redis对于缓存非常有用,但是当需要创建永久性数据存储时,MySQL等关系数据库是更好的选择。因此,将Redis数据同步到MySQL数据库允许你利用Redis的快速读取性能,同时保持持久性的数据存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值