mysql json查询_如何使用Redis缓存进行优化查询的效率

本文通过一个实际案例介绍了如何利用Redis缓存优化MySQL中的大表连接查询。在页面加载时,通过Ajax请求获取所有省份数据,并分析了优化步骤,包括数据库表创建、Web工程配置、DAO及Service实现,以及JDBC和Jedis工具类的使用。通过Redis缓存,提高了查询效率,当数据库数据变化时,需及时更新或清除缓存。
摘要由CSDN通过智能技术生成

3888e823d59f9b779eb924379a08ebe3.gif

2ad380a01abd19bab11fa4268d0331a9.png

案例需求

1. 提供index.html页面,页面中有一个省份 下拉列表

2. 当 页面加载完成后 发送ajax请求,加载所有省份

优化分析

fa36573d43eae1adc49da06436cc35c8.png

具体步骤及代码

  • 在Mysql数据库创建province表并且插入四条数据;

  • 创建一个web工程;

  • web/WEB-INF下创建lib,引入jar包:

    b7f8ecbdc39093b2354bae408cb03885.png

  • web下创建js文件夹,引入js:

    2d828337832c74096ead1101c47c8e8f.png

  • 引入druid.properties属性文件(连接MySQL数据库):

driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql:///day23username=rootpassword=rootinitialSize=5maxActive=10maxWait=3000
  • 引入jedis.properties属性文件(连接Redis数据库):

host=127.0.0.1port=6379maxTotal=50maxIdle=10
  • 编写domin-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;    }}
  • 编写Dao-ProvinceDao接口类

public interface ProvinceDao {    public List findAll();}
  • 编写Dao-ProvinceDaoImpl实现类

public class ProvinceDaoImpl implements ProvinceDao {    //1.声明成员变量 jdbctemplement    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());    @Override    public List findAll() {        //1.定义sql        String sql = "select * from province ";        //2.执行sql        List list = template.query(sql, new BeanPropertyRowMapper(Province.class));        return list;    }}
  • 编写Service-ProvinceService接口类

public interface ProvinceService {    public List findAll();    public String findAllJson();}
  • 编写Service-ProvinceServiceImpl实现类

public class ProvinceServiceImpl implements ProvinceService {    //声明dao    private ProvinceDao dao = new ProvinceDaoImpl();    @Override    public List findAll() {        return dao.findAll();    }    /**        使用redis缓存     */    @Override    public String findAllJson() {        //1.先从redis中查询数据        //1.1获取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中没数据,查询数据库...");            //2.1从数据中查询            List ps = dao.findAll();            //2.2将list序列化为json            ObjectMapper mapper = new ObjectMapper();            try {                province_json = mapper.writeValueAsString(ps);            } catch (JsonProcessingException e) {                e.printStackTrace();            }            //2.3 将json数据存入redis            jedis.set("province",province_json);            //归还连接            jedis.close();        }else{            System.out.println("redis中有数据,查询缓存...");        }        return province_json;    }}
  • 编写Web-ProvinceServlet

@WebServlet("/provinceServlet")public class ProvinceServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //1.调用service查询        ProvinceService service = new ProvinceServiceImpl();        String json = service.findAllJson();        System.out.println(json);        //2.响应结果        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);    }}
  • 引入JDBC工具类

/** * JDBC工具类 使用Durid连接池 */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;    }    /**     * 获取连接Connection对象     */    public static Connection getConnection() throws SQLException {        return  ds.getConnection();    }}
  • 引入Jedis工具类

/** JedisPool工具类    加载配置文件,配置连接池的参数    提供获取连接的方法 */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();    }}
  • 编写index.html

        Title                $(function () {            //发送ajax请求,加载所有省份数据            $.get("provinceServlet",{},function (data) {                //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]                //1.获取select                var province = $("#province");                //2.遍历json数组                $(data).each(function () {                    //3.创建                    var option = ""+this.name+"";                    //4.调用select的append追加option                    province.append(option);                });            });        });                                --请选择省份--        
  • 开启Tomcat服务器,打开浏览器,输入http:localhost:8080/index.html

  • 第一次查询后,控制台输出:

ceeedae07d9fe505c6776562203d4d4a.png

  • 第二次查询后,控制台输出:

ce84694f108dd99dcf0d99558f7eb7e9.png

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

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

                (1)数据库的表执行 增删改的相关操作,需要将redis缓存数据清空,再次存入

                (2)在service对应的增删改方法中,将redis数据删除。

570246c06bed4506d9879f85e7b41227.gif

55671fff45069163b9be0009c870fff5.png

b39408b06caf8c19223b8d967bccce34.gif

各位看官,

喜欢作者,

就给作者的馒头加点榨菜吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值