天天看点

JedisJedisJedis连接池

Jedis

概念:一款用Java语言操作redis数据库 的工具

使用步骤:

  1. 导入Jedis的jar包
  2. 使用:创建Jedis对象,调用相关方法,关闭连接
package com.jedis;

import redis.clients.jedis.Jedis;

public class JedisTest1 {
    public static void main(String[] args) {
        //创建Jedis对象
        Jedis jedis = new Jedis("localhost", 6379);

        //使用对应的方法
        jedis.set("hobby","basketball");

        //关闭连接
        jedis.close();
    }
}
           

注意:在创建Jedis对象时,如果不传入参数,默认是localhost和端口6379

使用Jedis操作redis数据库的5中数据类型

package com.jedis;

import jdk.nashorn.internal.ir.CallNode;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class JedisTest1 {
    public static void main(String[] args) {
        test5();
    }

    private static void test5() {
        //创建Jedis对象
        Jedis jedis = new Jedis("localhost", 6379);

        //使用对应的方法
        jedis.zadd("sortedset", 3, "后羿");
        jedis.zadd("sortedset", 30, "亚瑟");
        jedis.zadd("sortedset", 25, "猴子");

        Set<String> sortedset = jedis.zrange("sortedset", 0, -1);
        System.out.println(sortedset);

        //关闭连接
        jedis.close();
    }

    private static void test4() {
        //创建Jedis对象
        Jedis jedis = new Jedis("localhost", 6379);

       //使用对应的方法
        jedis.sadd("set", "a", "b", "c");
        Set<String> set = jedis.smembers("set");
        System.out.println(set);


        //关闭连接
        jedis.close();

    }

    private static void test3() {
        //创建Jedis对象
        Jedis jedis = new Jedis("localhost", 6379);

        //使用对应的方法
        jedis.lpush("list", "a", "b", "c");
        jedis.rpush("list","a","b","c");

        List<String> list = jedis.lrange("list", 0, -1);
        System.out.println(list);

        jedis.lpop("list");
        jedis.rpop("list");

        List<String> list1 = jedis.lrange("list", 0, -1);
        System.out.println(list1);


        //关闭连接
        jedis.close();
    }

    private static void test2() {
        //创建Jedis对象
        Jedis jedis = new Jedis("localhost", 6379);

        //使用对应的方法
        jedis.hset("user", "name", "zhangsan");
        jedis.hset("user", "age", "23");
        jedis.hset("user", "gender", "male");

        String name = jedis.hget("user", "name");
        System.out.println(name);

        Map<String, String> user = jedis.hgetAll("user");
        Set<String> keys = user.keySet();
        for (String s : keys) {
            String value = user.get(s);
            System.out.println(s + ":" + value);
        }

        //关闭连接
        jedis.close();
    }

    @Test
    public static void test1() {
        //创建Jedis对象
        Jedis jedis = new Jedis("localhost", 6379);

        //操作String类型
        jedis.set("hobby","basketball");

        String hobby = jedis.get("hobby");
        System.out.println(hobby);

        jedis.setex("activecode", 15, "验证码");

        //关闭连接
        jedis.close();
    }


}
           

Jedis连接池

常用配置

#最大活动对象数     
redis.pool.maxTotal=1000    
#最大能够保持idel状态的对象数      
redis.pool.maxIdle=100  
#最小能够保持idel状态的对象数   
redis.pool.minIdle=50    
#当池内没有返回对象时,最大等待时间    
redis.pool.maxWaitMillis=10000    
#当调用borrow Object方法时,是否进行有效性检查    
redis.pool.testOnBorrow=true    
#当调用return Object方法时,是否进行有效性检查    
redis.pool.testOnReturn=true  
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.  
redis.pool.timeBetweenEvictionRunsMillis=30000  
#向调用者输出“链接”对象时,是否检测它的空闲超时;  
redis.pool.testWhileIdle=true  
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
redis.pool.numTestsPerEvictionRun=50  
#redis服务器的IP    
redis.ip=xxxxxx  
#redis服务器的Port    
redis1.port=6379              

使用步骤

  1. 创建配置对象  JedisPoolConfig ,设置必要的配置
  2. 创建连接池对象 JedisPool
  3. 调用连接池对象的getResource方法,返回Jedis对象,再利用这个对象进行数据库操作
  4. 关闭Jedis对象(实际上并没有关闭,而是归还给连接池)
private static void test6() {
        //创建配置对象
        JedisPoolConfig config = new JedisPoolConfig();

        config.setMaxTotal(50);

        //创建连接池对象
        JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
        Jedis jedis = jedisPool.getResource();

        jedis.set("love", "love");

        jedis.close();

    }           

案例:在html页面加载下拉列表的省份数据,用到数据库访问和redis缓存优化。

架构图:

JedisJedisJedis连接池
JedisJedisJedis连接池

代码:

BaseDao类

package com.dao;

import com.utils.JDBCUtils;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;

public class BaseDao {

    //增删改
    public void updateData(Connection conn, String sql, Object... agrs) {
        PreparedStatement pstm = null ;
        try {
            //获取Statement对象
            pstm = conn.prepareStatement(sql);

            //填充占位符
            for (int i = 0; i < agrs.length; i++) {
                pstm.setObject(i + 1, agrs[i]);
            }

            int i = pstm.executeUpdate();

            System.out.println(i);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(null, pstm, null);
        }

    }

    //查
    public <T> ArrayList<T> query(Class<T> clazz , Connection conn, String sql, Object... args) {
        PreparedStatement pstm = null ;
        ResultSet rs = null ;

        try {
            //获取PreparedStatement对象
            pstm = conn.prepareStatement(sql);

            //填充占位符
            for (int i = 0; i < args.length; i++) {
                pstm.setObject(i + 1, args[i]);
            }

            //获取结果集对象
            rs = pstm.executeQuery();

            //获取结果集的元对象
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();

            ArrayList<T> list = new ArrayList<>();
            while (rs.next()) {
                T t = clazz.newInstance();
                for (int i = 1; i < columnCount + 1 ; i++) {
                    String columnLabel = metaData.getColumnLabel(i );
                    Field field = clazz.getDeclaredField(columnLabel);
                    field.setAccessible(true);
                    field.set(t, rs.getObject(columnLabel));
                }
                list.add(t);
            }
            return list ;

        } catch (SQLException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(null, pstm, rs);
        }
        return  null ;
    }

}
           

ProvinceDao接口

package com.dao;

import com.domain.Province;

import java.util.List;

public interface ProvinceDao {
    public List<Province> findAll();

    public String findAllFromRedis();

}
           

ProvinceDaoImpl实现类

package com.dao;

import com.domain.Province;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.utils.JDBCUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

public class ProvinceDaoImpl extends BaseDao implements ProvinceDao {

    @Override
    public List<Province> findAll() {

        String redis = this.findAllFromRedis();

        //判断redis是否有
        if (redis == null || redis.length() == 0) {
            System.out.println("没有数据缓存,查询数据库中...");
            //获取连接
            Connection conn = JDBCUtils.getConnection();

            //编写sql语句
            String sql = "select * from province";

            ArrayList<Province> list = this.query(Province.class, conn, sql);

            ObjectMapper objectMapper = new ObjectMapper();
            try {
                redis = objectMapper.writeValueAsString(list);

                //把redis存储在内存中
                Jedis jedis = new Jedis();
                jedis.set("province",redis);

                jedis.close();

            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }

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

            return null ;
        }

    }

    @Override
    public String  findAllFromRedis() {
        //这个部分有点随便,可以用配置文件来获取Jedis连接
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(50);

        JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
        Jedis jedis = jedisPool.getResource();

        String province = jedis.get("province");

        jedis.close();

        return province ;
    }


}
           

Province类

package com.domain;

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 + '\'' +
                '}';
    }
}
           

ProvinceService 接口

package com.service;

import com.domain.Province;

import java.util.List;

public interface ProvinceServce {
    public List<Province> findAll();

    public String findAllFromRedis();
}
           

ProvinceServiceImpl实现类

package com.service.impl;

import com.dao.ProvinceDao;
import com.dao.ProvinceDaoImpl;
import com.domain.Province;
import com.service.ProvinceServce;

import java.util.List;

public class ProvinceServiceImpl implements ProvinceServce {

    private ProvinceDao provinceDao = new ProvinceDaoImpl();


    @Override
    public List<Province> findAll() {
        List<Province> list = provinceDao.findAll();
        return list;
    }

    @Override
    public String findAllFromRedis() {
        String redis = provinceDao.findAllFromRedis();
        return redis;
    }

}
           

JDBCutils工具类

package com.utils;

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

public class JDBCUtils {
    public static Connection getConnection() {
        try {
        //加载配置文件
        InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");

        //创建配置文件对象
        Properties properties = new Properties();

       /* System.out.println(inputStream);*/

            //把配置文件加载到内存
            properties.load(inputStream);

            String username = properties.getProperty("username");
            String password = properties.getProperty("password");
            String url = properties.getProperty("url");
            String driverClass = properties.getProperty("driverClass");


            //加载注册驱动
            Class.forName(driverClass);

            Connection conn = DriverManager.getConnection(url, username, password);

            return conn ;

        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null ;
    }

    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
           

ProvinceServlet 类

package com.web.servlets;

import com.domain.Province;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.service.ProvinceServce;
import com.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;
import java.util.List;

@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ProvinceServce provinceServce = new ProvinceServiceImpl();
        List<Province> list = provinceServce.findAll();

        String redis = "";
        ObjectMapper objectMapper = new ObjectMapper();
        if (list == null) {
            redis = provinceServce.findAllFromRedis();
        }else {
            redis = objectMapper.writeValueAsString(list);
        }

        response.setContentType("application/json;charset=utf-8");

        response.getWriter().write(redis);
    }

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

jdbc.properties配置文件

username=root
password=123456
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver           

province.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择省份</title>
    <script src="../js/jquery-3.4.1.min.js"></script>
    <script>
        $(function () {

            $.get("/provinceServlet", function (data) {
                for (var i = 0; i < data.length; i++) {
                    var province = data[i];
                    for (var key in province) {
                        if (key == "name") {
                           // alert(province[key]);
                            var $select = $("#select");
                            $select.append("<option>"+province[key]+"</option>")
                        }
                    }
                }

            });



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

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

</body>
</html>           

继续阅读