1. 程式人生 > 實用技巧 >Spring中使用Jedis操作redis

Spring中使用Jedis操作redis

13Spring中使用Jedis操作redis

Redis是一款開源的記憶體KV儲存,相比較於membercached只有一種資料結構,redis支援多種資料結構。

Spring對Redis的支援

Spring中通過Spring Data Redis這個模組實現對Redis的支援。操作Redis的方式有以下幾種:

  • 支援的客戶端 Jedis / Lettuce
  • RedisTemplate
  • Repository支援

Jedis客戶端的簡單使用

  • Jedis的例項不是執行緒安全的,也就是在多執行緒場景下,不能使用同一個Jedis例項。
  • 通過JedisPool中維護Jedis例項,當需要使用的時候從JedisPool中獲取Jedis例項。
  • 獲取到Jedis例項之後進行對應業務方法的呼叫

talk is easy ,show me the code

引入Jedis依賴

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

配置建立JedisPoolConfig

由於Jedis例項非執行緒安全,所以使用JedisPool來建立維護Jedis。先在application.properties

檔案中對JedisPool進行配置

redis.host=localhost
#連線池的最大資料庫連線數 。設為0表示無限制,如果是jedis 2.4以後用redis.maxTotal ,在這之前使用maxActive
redis.maxTotal=5
#控制一個pool最多有多少個狀態為空閒(idle)的jedis例項
redis.maxIdle=5
#在呼叫(borrow)一個jedis例項時,是否提前進行驗證操作,如果為true,則得到的jedis例項均是可用的
redis.testOnBorrow=true

使用JedisPool的配置,建立JedisPoolConfig這個Bean

    @Bean
    @ConfigurationProperties("redis")
    public JedisPoolConfig jedisPoolConfig() {
        return new JedisPoolConfig();
    }

同樣的,為什麼是使用maxTotal、maxIdle、testOnBorrow這幾個欄位,而不是其他的其他名稱的欄位。首先字首redis是我們自己定義的,這個是可以修改的,這個就不多說了。

上圖是JedisPoolconfig的類關係圖,其父類中定義了maxTotal、maxIdle等欄位。至於testOnBorrow這個欄位名是在GenericObjectPoolConfig的父類BaseObjectPoolConfig中定義的。

配置建立JedisPool

    @Bean(destroyMethod = "close")
    public JedisPool jedisPool(@Value("${redis.host}") String host) {
        return new JedisPool(jedisPoolConfig(), host);
    }

使用自定義的JedisPoolConfig 並傳入host資訊,來完成JedisPool的建立。

使用Jedis例項操作Redis

        try (Jedis jedis = jedisPool.getResource()) {
            jedis.set("name", "張三");

            log.info("redis value:{}", jedis.get("name"));
        }
  • 首先通過JedisPool獲取Jedis例項
  • 通過Jedis例項提供的API進行資料的存取

常用Util

public class RedisPool {
    //Redis伺服器IP
    private static String ADDR = "127.0.0.1";
    //Redis的埠號
    private static int PORT = 6379;
    //訪問密碼
    private static String AUTH = "123456";
    //可用連線例項的最大數目,預設值為8;
    //如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis例項,則此時pool的狀態為exhausted(耗盡)。
    private static int MAX_ACTIVE = 1024;
    //控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項,預設值也是8。
    private static int MAX_IDLE = 200;
    //等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接丟擲JedisConnectionException;
    private static int MAX_WAIT = 10000;
    private static int TIMEOUT = 10000;
    //在borrow一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的;
    private static boolean TEST_ON_BORROW = true;
    private static JedisPool jedisPool = null;
    /**
     * 初始化Redis連線池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
//            config.setMaxActive(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
//            config.setMaxWait(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取Jedis例項
     * @return
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

更多配置資訊

#ip地址
redis.hostName=172.20.1.205  
#埠號
redis.port=6379  
#如果有密碼
redis.password=123456  
#客戶端超時時間單位是毫秒 預設是2000
redis.timeout=10000
#最大空閒數
redis.maxIdle=300  
#連線池的最大資料庫連線數。設為0表示無限制,如果是jedis 2.4以後用redis.maxTotal
#redis.maxActive=600
#控制一個pool可分配多少個jedis例項,用來替換上面的redis.maxActive,如果是jedis 2.4以後用該屬性
redis.maxTotal=1000  
#最大建立連線等待時間。如果超過此時間將接到異常。設為-1表示無限制。
redis.maxWaitMillis=1000  
#連線的最小空閒時間 預設1800000毫秒(30分鐘)
redis.minEvictableIdleTimeMillis=300000  
#每次釋放連線的最大數目,預設3
redis.numTestsPerEvictionRun=1024  
#逐出掃描的時間間隔(毫秒) 如果為負數,則不執行逐出執行緒, 預設-1
redis.timeBetweenEvictionRunsMillis=30000  
#是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個
redis.testOnBorrow=true  
#在空閒時檢查有效性, 預設false
redis.testWhileIdle=true