Jedis
概念:一款用Java語言操作redis資料庫 的工具
使用步驟:
- 導入Jedis的jar包
- 使用:建立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
使用步驟
- 建立配置對象 JedisPoolConfig ,設定必要的配置
- 建立連接配接池對象 JedisPool
- 調用連接配接池對象的getResource方法,傳回Jedis對象,再利用這個對象進行資料庫操作
- 關閉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緩存優化。
架構圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR1kMjpWTyEEVOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL2EzN2ITNxITMzIzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
代碼:
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>