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
maxIdle:jedis最大活躍數 , maxTotal :jedis最大連線數 , minIdle : jedis最小空閒數(連線池中最少保留的jedis連線數),testOnBorrow :在borrow一個jedis的時候驗證其是否可用,可用則返回,不可用則廢棄重新建立一個<!-- 使用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快取 -->
注:當併發比較大的時候,如果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整合Redis及RedisTemplate常用操作
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. 下載