NOSQL非关系型数据库-Redis缓存优化案例

4 篇文章 0 订阅

案例需求

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

分析

代码

未使用优化前:

service层

public class ProvinceServiceImpl implements ProvinceService {
    //声明dao
    private ProvinceDao dao = new ProvinceDaoImpl();

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

dao层

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

@Override
public List<Province> findAll() {

    //1.定义sql
    String sql = "select * from province";
    //执行sql
    List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
    System.out.println(list);
    return list;
}

Redis优化

  • 省份的数据不是经常发生变化的,每一次访问都去访问数据库就就提高了访问频率,会给数据库增加压力;利用缓存的思想(Redis缓存)。

service层

 package com.web.service.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.web.Jedis.util.JedisPoolUtils;
import com.web.dao.ProvinceDao;
import com.web.dao.impl.ProvinceDaoImpl;
import com.web.domain.Province;
import com.web.service.ProvinceService;
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() {
        //1.先从Redis中查询数据
        //1.1 获取Redis客户端连接
        Jedis jedis = JedisPoolUtils.getJedis();
        String provice_json = jedis.get("province");

        //2.判断province——json是否为null
        if (provice_json == null||provice_json.length()==0) {
            //redis中没有数据
            System.out.println("redis中没有数据,查询数据库。。。");
            //2.1从数据库中查询
            List<Province> ps = dao.findAll();
            //2.2将list序列化为json
            ObjectMapper mapper = new ObjectMapper();
            try {
                provice_json = mapper.writeValueAsString(ps);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            //2.3将数据存入redis
            jedis.set("province",provice_json);
            //归还连接
            jedis.close();

        }else {
            System.out.println("redis中有数据,查询缓存");
        }



        return provice_json;
    }

}

Servlet层

package com.web.web.servlet;

import com.web.service.ProvinceService;
import com.web.service.impl.ProvinceServiceImpl;

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(urlPatterns = "/findProvinceServlet")
public class FindProvinceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

         /*//1.调用service查询
        ProvinceService service = new ProvinceServiceImpl();
        List<Province> list = service.findAll();

        //2.序列化list为JSON
        ObjectMapper mapper = new ObjectMapper();
        String JSON = mapper.writeValueAsString(list);
        System.out.println(JSON);*/

         //1.调用service查询
        ProvinceService service = new ProvinceServiceImpl();
        String json = service.findAllJson();
        //响应结果
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(json);

    }

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

优化后

注意

1. 使用redis缓存一些不经常发生变化的数据。
2. 数据库的数据一旦发生改变,则需要更新缓存。
3. 数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
4. 在service对应的增删改方法中,将redis数据删除。

git 源码

点击去git 获取源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值