天天看點

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>           

繼續閱讀