1. 程式人生 > >spring專案整合jedis及注意事項

spring專案整合jedis及注意事項

首先我們需要引入jedis相關的包:(版本跟redis版本無關,不用擔心版本問題)

<span style="white-space:pre">		</span><dependency>
		    <groupId>redis.clients</groupId>
		    <artifactId>jedis</artifactId>
		    <version>2.5.2</version>
		</dependency> 

接下來我們要在spring的配置檔案中配置jedispool(快取池)跟jedis的bean

  <!-- 使用redis快取 -->    
   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
       <property name="maxTotal" value="50000" />  
       <property name="maxIdle" value="50000" />  
       <property name="minIdle" value="100" /> 
       <property name="maxWaitMillis" value="15000"/>  
       <property name="testOnBorrow" value="true" />  
   </bean> 

    <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"  scope="singleton">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <bean class="redis.clients.jedis.JedisShardInfo">
                    <constructor-arg name="host" value="127.0.0.1" />
                    <constructor-arg name="port" value="6379" />
                     <constructor-arg name="timeout" value="3000" />
                    <constructor-arg name="weight" value="1" />
                </bean>
            </list>
        </constructor-arg>
    </bean>
      <!-- end使用redis快取 -->   
maxIdle:jedis最大活躍數   , maxTotal :jedis最大連線數   , minIdle : jedis最小空閒數(連線池中最少保留的jedis連線數),testOnBorrow :在borrow一個jedis的時候驗證其是否可用,可用則返回,不可用則廢棄重新建立一個 

注:當併發比較大的時候,如果maxTotal小於併發請求數,程式在jedispool中去borrow一個jedis時獲取不到,則會報Could not get a resource from the pool
at redis.clients.util.Pool.getResource異常

接下來我們看一下如何呼叫jedis進行操作

RedisDataSource 介面:

package com.smc.topic.redis;

import redis.clients.jedis.ShardedJedis;

public interface RedisDataSource {
    public abstract ShardedJedis getRedisClient();
    public void returnResource(ShardedJedis shardedJedis);
    public void returnResource(ShardedJedis shardedJedis,boolean broken);
}

RedisDataSource實現類:
package com.smc.topic.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Repository("redisDataSource")
public class RedisDataSourceImpl implements RedisDataSource {

    private static final Logger log = LoggerFactory.getLogger(RedisDataSourceImpl.class);

    @Autowired
    private ShardedJedisPool  shardedJedisPool;

    
    public ShardedJedis getRedisClient() {
        try {
            ShardedJedis shardJedis = shardedJedisPool.getResource();
            return shardJedis;
        } catch (Exception e) {
            log.error("getRedisClent error", e);
        }
        return null;
    }

    public void returnResource(ShardedJedis shardedJedis) {
        shardedJedisPool.returnResource(shardedJedis);
    }

    public void returnResource(ShardedJedis shardedJedis, boolean broken) {
        if (broken) {
            shardedJedisPool.returnBrokenResource(shardedJedis);
        } else {
            shardedJedisPool.returnResource(shardedJedis);
        }
    }
}
package com.smc.topic.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Repository("redisClientTemplate")
public class RedisClientTemplate {

    private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class);

    
    @Autowired
    private ShardedJedisPool  shardedJedisPool;

    
    public ShardedJedis getRedisClient() {
        try {
            ShardedJedis shardJedis = shardedJedisPool.getResource();
            return shardJedis;
        } catch (Exception e) {
            log.error("getRedisClent error", e);
        }
        return null;
    }
    
    /**
     * 獲取單個值
     * 
     * @param key
     * @return
     */
    public String get(String key) {
        String result = null;
        ShardedJedis shardedJedis = shardedJedisPool.getResource();
        if (shardedJedis == null) {
            return result;
        }

        boolean broken = false;
        try {
            result = shardedJedis.get(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }
    
    
    public String get(String key,ShardedJedis shardedJedis,boolean isReturn) {
        String result = null;
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.get(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
        	if(isReturn){
        		returnResource(shardedJedis, broken);
        	}
        }
        return result;
    }
    
    public String set(String key, Object value,ShardedJedis shardedJedis,boolean isReturn) {
        String result = null;
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.set(key.getBytes(), SerializeUtils.serialize(value));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
        	if(isReturn){
        		returnResource(shardedJedis, broken);
        	}
        }
        return result;
    }
    
    /**
     * 設定單個值
     * 
     * @param key
     * @param value
     * @return
     */
    public String set(String key, Object value) {
        String result = null;

        ShardedJedis shardedJedis = shardedJedisPool.getResource();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.set(key.getBytes(), SerializeUtils.serialize(value));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }
    
    
    
    public String setsx(String key, String value,Integer seconds) {
        String result = null;

        ShardedJedis shardedJedis = shardedJedisPool.getResource();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.setex(key,seconds, value);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }
    
    public String setsx(String key, String value,Integer seconds,ShardedJedis shardedJedis,boolean isReturn) {
        String result = null;
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.setex(key,seconds, value);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
        	if(isReturn){
        		returnResource(shardedJedis, broken);
        	}
        }
        return result;
    }

    
    

    public void returnResource(ShardedJedis shardedJedis) {
        shardedJedisPool.returnResource(shardedJedis);
    }

    public void returnResource(ShardedJedis shardedJedis, boolean broken) {
        if (broken) {
            shardedJedisPool.returnBrokenResource(shardedJedis);
        } else {
            shardedJedisPool.returnResource(shardedJedis);
        }
    }
    
    
    
    public void disconnect() {
        ShardedJedis shardedJedis = shardedJedisPool.getResource();
        shardedJedis.disconnect();
    }

    

    public Boolean exists(String key) {
        Boolean result = false;
        ShardedJedis shardedJedis = getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.exists(key);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }

    public String type(String key) {
        String result = null;
        ShardedJedis shardedJedis = getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.type(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }

    /**
     * 在某段時間後失效
     * 
     * @param key
     * @param unixTime
     * @return
     */
    public Long expire(String key, int seconds) {
        Long result = null;
        ShardedJedis shardedJedis = getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.expire(key, seconds);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }

    /**
     * 在某個時間點失效
     * 
     * @param key
     * @param unixTime
     * @return
     */
    public Long expireAt(String key, long unixTime) {
        Long result = null;
        ShardedJedis shardedJedis = getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.expireAt(key, unixTime);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }

    public Long del(String key) {
        Long result = null;
        ShardedJedis shardedJedis = getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.del(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            returnResource(shardedJedis, broken);
        }
        return result;
    }
 
}

注意:1.每次使用完jedis後一定要return,不然會一直佔用這jedis資源,導致很多問題的出現。

    2.在一個方法中多次呼叫jedis的get,set方法時,最好使用一個jedis(即呼叫帶isReturn引數的方法,在最後一次呼叫時傳入isReturn為true即可),這樣會少了多次去連線池拿例項的過程,提高程式效率。

相關推薦

spring專案整合jedis注意事項

首先我們需要引入jedis相關的包:(版本跟redis版本無關,不用擔心版本問題)<span style="white-space:pre"> </span><dependency> <groupId>redis

Spring Boot 整合Mybatis+MySql注意事項

資料庫連線池之坑 通常我們使用資料庫時會使用第三方的資料庫連線池,在這裡我使用了 <dependency> <groupId>com.alibaba</groupId>

Spring boot 整合mybatis通用mapper配置步驟注意事項

一、新增依賴 二、繼承通用mapper,可以重寫和選擇需要的mapper方法,可以去掉一些不需要的方法(一般直接繼承即可) Mapper3提供的全部的方法,可以檢視Mapper3通用介面大全 三、application.properties配置 四、設定dao路徑 在

最全面的EventBus 3.1的使用教程官方推薦的結合訂閱者索引processor顯著提升效能和實際專案中的使用注意事項

需求場景 無論是現在的專案還是以前的專案中,都會遇見執行緒之間通訊,元件之間通訊的需求,我們知道這些需求都可以使用EventBus來處理,為了對比體現出EventBus使用的方便簡潔,我們先來回顧下在EventBus出現以前我們是怎麼處理執行緒間通訊和元件間通訊的。 1,執行緒間通訊

從零開始使用vue-cli搭建一個vue專案注意事項

一、安裝node.js   1.根據電腦的自行下載node.js安裝包http://nodejs.cn        2.點選安裝,按照正常的的一路點選下去   3.驗證安裝是否成功,按鍵win+r,輸入cmd開啟命令列工具,點選確認後再輸入node -v 出現版本好說明npm安裝成功  

SpringMVC+MongoDB整合注意事項

java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement;Ljava/lang

Spring+Data+JPA持久層的使用注意事項(三)——Failed to load ApplicationContext無法載入配置檔案

Failed to load ApplicationContext這個問題是有很多的,我的檢查過程是這樣:1,檢查web.xml中對於spring的listener的配置是否有問題,因為我這是一鍵生成的,所以主要是看路徑問題,也就是location有沒有配對    <!

專案覆盤內容注意事項

1.回顧目標 2.結果比對 3.敘述過程 4.自我剖析 5.眾人設問 6.總結規律 7.案例佐證 8.覆盤歸檔 我們做覆盤總結出發的目的:讓個人和團隊,在專案實踐中總結問題與經驗,能夠發掘到新的思路,認清問題本質,找到規律避免重複犯錯,進而提升每

node.js 整合 ueditor 步驟注意事項

這裡是我費了一天的心思總算成功的搞好了 node.js 與 ueditor 整合的過程。做一個小白真難啊,非摸著石頭過河。今天心好累,要多說一點廢話。完成這個內容之前,首先你得保證你引用ueditor的介面在 nodejs 專案中。以我的介面為例,就在 myapp/publi

熱更新--bugly整合注意事項

本文主要是記錄了為什麼選擇bugly, bugly整合過程,使用過程中出現的問題,以及需要注意的事項。 熱更新就是動態下發程式碼,它可以使開發者在不釋出新版本的情況下,修復 BUG 和釋出功能的一個技術方案。 關於熱更新更詳細的解讀,可以轉到文末參考文章第一篇看

Eclipse開發環境下web專案如何部署到tomcat注意事項

一、摘要 本文探討eclipse開發環境下,web專案如何部署到tomcat下,部署後module顯示名稱與web專案名稱不一致,tomcat啟動時報class not found錯誤等常見問題解答。 二、如何部署到tomcat下 1、配置tomc

H5手機移動端WEB開發資源整合 常用的標籤注意事項

meta基礎知識 H5頁面視窗自動調整到裝置寬度,並禁止使用者縮放頁面 <metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum

android APP整合系統詳細步驟注意事項(amlogic平臺)

此說明用於amlogic平臺整合不簽名的apk。(如何判斷整合的apk需不需要簽名。簡單來說使用U盤安裝後,能正常開啟使用的就可以不簽名方式整合。) 各平臺的檔案系統有差異,但整體大同小異。其他平臺

友盟整合qq登入注意事項

在成功的方法裡的得到使用者頭像,使用者名稱等資訊 (Map集合中取得) Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show(); //載入使用者名稱 name.setText(data.put("name",

【VUE】git命令列程式碼提交流程注意事項

本篇為我在提交程式碼的過程中使用過的命令 僅做記錄參考 git命令還有很多 其他功能 可自行百度 命令git add (1)git add . 提交全部修改檔案 (2)git add +檔名 提交單個檔案 命令 git commit -m '描述’ eg: git commi

重灌系統後,重新安裝ORACLE加環境變數配置、客戶端PL/SQL的安裝過程,注意事項(避免再次踩坑)

(1)首先了解什麼是OERACLE及Oracle與PL/SQL是什麼關係: ORACLE是資料庫,有客戶端和伺服器; PLSQL Developer只是第三方工具,服務於ORACLE,類似的工具還有Toad,sqlplus,sql developer等等; 安裝PLSQL Developer

Spring Boot整合RedisRedisTemplate常用操作

Spring Boot整合Redis maven依賴 <!-- redis 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <

【C++】向量(vector) 基本使用方法注意事項

介紹: 向量(Vector)是一個封裝了動態大小陣列的順序容器(Sequence Container)。跟任意其它型別容器一樣,它能夠存放各種型別的物件。可以簡單的認為,向量是一個能夠存放任意型別的動態陣列。 特點: 1.順序序列 順序容器中的元素按照嚴格的線性順序排序。可以通過元素

Windows下RabbitMQ安裝注意事項

Windows下RabbitMQ安裝及注意事項 簡介 背景 1.      RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue)的開源實現。 RabbitMQ是實現AMQP(高階訊息佇列協議)的訊

XV6環境搭建注意事項

Ubuntu16.04SLT 64位 工具鏈 sudo apt-get install gcc-multilib libsdl1.2-dev, libtool-bin, libglib2.0-dev, libz-dev, and libpixman-1-dev.     下載