Jedis簡介
- Java語言連接Redis
- Jedis
- SpringData Redis
- lettuce
- 可視化連接Redis客戶端
- Redis Desktop Manager
- Redis Client
- Redis Studio
Hello World
準備工作
- jar包導入
下載地址:https://mvnrepository.com/artifact/redis.clients/jedis - 基於maven
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
客戶端連接Redis
- 連接redis
- 操作redis
- 關閉redis
代碼演示:
package com.bupt.edu.cn;
import redis.clients.jedis.Jedis;
public class JedisTest {
public static void main(String[] args) {
// 1.連接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.auth("your password"); // 連接redis的密碼
// 2.操作redis
jedis.set("name", "Eamon");
String name = jedis.get("name");
System.out.println(name);
// 3.關閉redis
jedis.close();
}
}
Jedis讀寫Redis數據
通過一個案例來演示Jedis的讀寫
案例:服務調用次數控制
人工智能領域的語音識別,訊飛免費開放給企業試用,同時訊飛訓練自己的模型。現對用戶的使用行爲進行限速,限制每個用戶每分鐘最多發起10次調用。
-
案例需求
- 設定兩個級別A、B類型用戶
- A用戶限制10次/分鐘,B用戶限制30次/分鐘
-
需求分析
- 設定一個服務方法,模擬實際業務調用的服務。簡化爲打印信息
- 在業務調用前調用控制單元,內部使用redis進行控制
- 對調用超過限度的用戶進行控制,異常處理簡化爲打印提示信息
- 主程序啓動2個線程,分別表示兩個不同用戶的調用
代碼演示如下:
package com.bupt.edu.cn;
import com.bupt.edu.cn.util.JedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisDataException;
public class Service {
private String id;
private int num;
public Service(String id, int num) {
this.id = id;
this.num = num;
}
// 控制單元
public void service() {
Jedis jedis = new Jedis("127.0.0.1", 6379);
// Jedis jedis = JedisUtils.getJedis();
jedis.auth("24862486");
String value = jedis.get("compid:" + id);
// 判斷該值是否存在
try {
if (value == null) {
// 不存在,創建該值
// long.MAX_VALUE-num 當超出的時候就會報錯,進入catch,通過這個邏輯判斷是否使用次數超過num
jedis.setex("compid:" + id, 5, Long.MAX_VALUE - num + "");
} else {
// 存在,自增,調用業務
Long val = jedis.incr("compid:" + id);
business(id, num - Long.MAX_VALUE + val);
}
} catch (JedisDataException e) {
System.out.println("使用以已經到達次數上限,請升級會員級別");
return;
} finally {
jedis.close();
}
}
// 模擬業務操作
public void business(String id, Long val) {
System.out.println(id + "業務執行第" + val + "次");
}
}
// 模擬用戶調用業務
class MyThread extends Thread {
Service sc;
public MyThread(String id, int num) {
sc = new Service(id, num);
}
@Override
public void run() {
while (true) {
sc.service();
try {
Thread.sleep(300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Main {
public static void main(String[] args) {
// 設定多線程,模擬用戶操作
MyThread mt1 = new MyThread("初級用戶", 10);
MyThread mt2 = new MyThread("高級用戶", 30);
mt1.start();
mt2.start();
}
}
Jedis簡易工具類開發
基於連接池獲取連接
- JedisPool:Jedis提供的連接池技術
poolConfig:連接池配置對象 host:redis服務地址 port:redis服務端口號
public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port){
this(poolConfig, host, port, 2000, (String)null, 0, (Strng)null);
}
封裝連接參數
- jedis.properties
jedis.host=localhost
jedis.port=6379
jedis.maxTotal=30
jedis.maxIdle=10
代碼演示:
package com.bupt.edu.cn.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
public class JedisUtils {
private static JedisPool jp = null;
private static String host = null;
private static Integer port;
private static Integer maxTotal;
private static Integer maxIdle;
static {
ResourceBundle rb = ResourceBundle.getBundle("redis");
host = rb.getString("redis.host");
port = Integer.parseInt(rb.getString("redis.port"));
maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdle);
jp = new JedisPool(jpc, host, port);
}
public static Jedis getJedis() {
return jp.getResource();
}
}
此時在Jedis讀寫Redis的示例中,獲取jedis時,可以將
Jedis jedis = new Jedis("127.0.0.1", 6379);
替換爲
Jedis jedis = JedisUtils.getJedis();
這樣可以達到解耦的效果,將數據庫配置和代碼分離開。
點擊查看關於Java讀取配置文件的更多方式。