Redis系列四:Java連接Redis—Jedis

Jedis簡介

  • Java語言連接Redis
    • Jedis
    • SpringData Redis
    • lettuce
  • 可視化連接Redis客戶端
    • Redis Desktop Manager
    • Redis Client
    • Redis Studio

Hello World

準備工作

客戶端連接Redis

  1. 連接redis
  2. 操作redis
  3. 關閉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讀取配置文件的更多方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章