1. 程式人生 > >redis客戶端jedis基於spring搭建單節點或者叢集執行緒池連線

redis客戶端jedis基於spring搭建單節點或者叢集執行緒池連線

基於jedis執行緒池搭建單節點或叢集連線完整程式碼

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

1:properties配置檔案

###########

redis.model=single
redis.url=10.128.90.60:6377
redis.testOnBorrow=true
redis.testOnReturn=true
redis.maxTotal=400
redis.maxIdle=5
redis.jmxEnable=true
redis.timeout=3000
redis.masterName=mymaster
redis.password=ustc


###########

2:jedis資訊類

-----------------------------------------------------------

package com.gccloud.www.OCTP.support.jedis;

public class JedisConfig {

public static final String SINGLE_MODEL = "single";
public static final String SENTINEL_MODEL = "sentinel";

private String model;
private String url;
private boolean testOnBorrow;
private boolean testOnReturn;
private int maxTotal;
private int maxIdle;
private boolean jmxEnable;
private int timeout;
private String masterName;
private String password;

     public static String getSingleModel() {
return SINGLE_MODEL;
}
public static String getSentinelModel() {
return SENTINEL_MODEL;
}

       //省略get、set方法

-----------------------------------------------------------

3:  jedisConfig的bean配置

*************************************

<bean id="jedisConfig" class="com.gccloud.www.OCTP.support.jedis.JedisConfig">
<!-- redis連線型別,single單節點,sentinel哨兵 模式 -->
<property name="model" value="${redis.model}" />
<!-- redis連線資訊,ip:port -->
<property name="url" value="${redis.url}" />
<!-- 檢測開關 -->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<!-- 檢測開關 -->
<property name="testOnReturn" value="${redis.testOnReturn}" />
<!-- 最大連線數 -->
<property name="maxTotal" value="${redis.maxTotal}" />
<!-- 最大空閒 -->
<property name="maxIdle" value="${redis.maxIdle}" />
<!-- 最大連線數 -->
<property name="jmxEnable" value="${redis.jmxEnable}" />
<!-- 讀取超時時間 -->
<property name="timeout" value="${redis.timeout}" />
<!-- masterName,哨兵模式需要配置 -->
<property name="masterName" value="${redis.masterName}" />
<!-- 密碼 -->
<property name="password" value="${redis.password}" />
</bean>

*************************************

4:工廠類 JedisPoolFactory

*************************************

package com.gccloud.www.OCTP.support.jedis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import com.gccloud.www.OCTP.support.jedis.client.JedisSentinelFacotry;
import com.gccloud.www.OCTP.support.jedis.client.JedisSingleFactory;

public abstract class JedisPoolFactory {

private JedisConfig jedisConf;
private static final Logger LOGGER = LoggerFactory.getLogger(JedisPoolFactory.class);
/**
* 工廠方法
* @param jedisConf
* @return
*/
public static JedisPoolFactory getRedisFactory(JedisConfig jedisConf){

LOGGER.info("準備載入jedis物件,{}",jedisConf);

if(JedisConfig.SINGLE_MODEL.equals(jedisConf.getModel())){

LOGGER.info("載入單節點jedis物件!");

return new JedisSingleFactory(jedisConf);

}else if (JedisConfig.SENTINEL_MODEL.equals(jedisConf.getModel())){

LOGGER.info("載入哨兵模式jedis物件!");

return new JedisSentinelFacotry(jedisConf);

}else{
LOGGER.info("jedis模式未知,無法載入!");
throw new RuntimeException("jedis模式未知,無法載入!" + jedisConf);
}

}

/**
* 獲取jedis連線例項
* @return
*/
public abstract Jedis getJedis();

/**
* 歸還例項
* @param jedis
*/
public abstract void closeJedis(Jedis jedis);


}

*************************************

5-1:Sentinel模式

*************************************


import java.util.HashSet;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import com.gccloud.www.OCTP.support.jedis.JedisPoolFactory;
import com.gccloud.www.OCTP.support.jedis.JedisConfig;

/**
 * Sentinel模式的jedis連線
 * @author feng
 *
 */
public class JedisSentinelFacotry extends JedisPoolFactory{

private JedisConfig jedisConf;
private JedisSentinelPool jSentinelPool;
private final static Logger LOGGER = LoggerFactory.getLogger(JedisSentinelFacotry.class);

public JedisSentinelFacotry(JedisConfig jedisConf){
this.jedisConf  = jedisConf;
initPool();
}

/**
* 初始化連線池
*/
private void initPool(){

LOGGER.info("初始化 redis Sentinel連線池! redisSentinelUrl={}",jedisConf.getUrl());

String[] urls = jedisConf.getUrl().split(",");
Set<String> urlset = new HashSet<String>();
CollectionUtils.addAll(urlset, urls);
GenericObjectPoolConfig gPoolConfig=new GenericObjectPoolConfig();
if(jedisConf.getMaxTotal() !=0 ){
gPoolConfig.setMaxTotal(jedisConf.getMaxTotal());
}
if(jedisConf.getMaxIdle() !=0){
gPoolConfig.setMaxIdle(jedisConf.getMaxIdle());
}
gPoolConfig.setJmxEnabled(jedisConf.isJmxEnable());
gPoolConfig.setTestOnBorrow(jedisConf.isTestOnBorrow());
gPoolConfig.setTestOnReturn(jedisConf.isTestOnReturn());

if(jedisConf.getPassword() != null && jedisConf.getPassword().trim().length() > 0){
jSentinelPool = new JedisSentinelPool(jedisConf.getMasterName(), urlset, gPoolConfig, jedisConf.getTimeout(), jedisConf.getPassword());
}else{
jSentinelPool = new JedisSentinelPool(jedisConf.getMasterName(), urlset, gPoolConfig, jedisConf.getTimeout());
}

LOGGER.info("jedis Sentinel連線池初始化完成!");
}


/**
* 獲取jedis連線
* @return
*/
public synchronized Jedis getJedis(){

Jedis jedis  = null;
int count =0;
do{  
            try{   
                jedis = jSentinelPool.getResource();  
            } catch (Exception e) {  
            LOGGER.error("get redis failed!", e);
            e.printStackTrace();
                 // 銷燬物件    
            jSentinelPool.returnBrokenResource(jedis);    
            }  
            count++;  
        }while(jedis==null && count<3 );  
        return jedis;

}

/**
* 歸還連線
* @param jedis
* @param redisUrl
*/
public synchronized void closeJedis(Jedis jedis) { 

        if(jedis != null) {  
            try {
            jSentinelPool.returnResource(jedis);
} catch (Exception e) {
LOGGER.error("return redis failed!", e);
jSentinelPool.returnBrokenResource(jedis);
}  
        }  
    }
}

************************************

5-2:single模式

***********************************



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Protocol;


import com.gccloud.www.OCTP.support.jedis.JedisPoolFactory;
import com.gccloud.www.OCTP.support.jedis.JedisConfig;
public class JedisSingleFactory extends JedisPoolFactory{

private JedisConfig jedisConf;
private JedisPool jedisPool;

private static final Logger LOGGER = LoggerFactory.getLogger(JedisSingleFactory.class);

public JedisSingleFactory(JedisConfig jedisConf){
this.jedisConf = jedisConf;
initPool();

}

private void initPool() {
// TODO Auto-generated method stub

LOGGER.info("初始化 redis single連線池! single={}",jedisConf);

String jedisUrl = jedisConf.getUrl();
String[] ipAndPort = jedisUrl.split(":");
if(ipAndPort == null || ipAndPort.length !=2){
LOGGER.error("jedis single初始化失敗,ip埠配置異常!");
throw new RuntimeException("jedis single初始化失敗,ip埠配置異常!");
}
JedisPoolConfig gPoolConfig=new JedisPoolConfig();
if(jedisConf.getMaxIdle() != 0){

gPoolConfig.setMaxIdle(jedisConf.getMaxIdle());
}
if(jedisConf.getMaxTotal()!=0){

gPoolConfig.setMaxTotal(jedisConf.getMaxTotal());
}
gPoolConfig.setJmxEnabled(jedisConf.isJmxEnable());
gPoolConfig.setTestOnBorrow(jedisConf.isTestOnBorrow());
gPoolConfig.setTestOnReturn(jedisConf.isTestOnReturn());

if(jedisConf.getPassword() != null && jedisConf.getPassword().trim().length() > 0){
jedisPool = new JedisPool(gPoolConfig, ipAndPort[0], Integer.valueOf(ipAndPort[1]), jedisConf.getTimeout(), jedisConf.getPassword(), Protocol.DEFAULT_DATABASE);
}else{
jedisPool =  new JedisPool(gPoolConfig, ipAndPort[0], Integer.valueOf(ipAndPort[1]), jedisConf.getTimeout());
}

LOGGER.info("jedis single連線池初始化完成!");
}

/**
* 獲取jedis連線
* @return
*/
public synchronized Jedis getJedis(){
Jedis jedis  = null;
int count =0;
do{  
            try{   
            LOGGER.debug("redis當前執行緒池活動數量:{},空閒數量{},等待數量{}",jedisPool.getNumActive(),jedisPool.getNumIdle());
           
                jedis = jedisPool.getResource();  
            } catch (Exception e) {  
            LOGGER.error("get redis failed!", e);
            e.printStackTrace();
                 // 銷燬物件    
            jedisPool.returnBrokenResource(jedis);    
            }  
            count++;  
        }while(jedis==null && count<3 );  
        return jedis;
}

/**
* 歸還連線
* @param jedis
* @param redisUrl
*/
public synchronized void closeJedis(Jedis jedis) { 
        if(jedis != null) {  
            try {
            jedisPool.returnResource(jedis);
} catch (Exception e) {
LOGGER.error("return redis failed!", e);
jedisPool.returnBrokenResource(jedis);
}  
        }  
    }
}

***********************************

6:main測試

***********************************

public static void main(String[] args) {

AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        JedisConfig jedisConf =  (JedisConfig)applicationContext.getBean("jedisConfig");
        JedisPoolFactory jedisPoolFactory = JedisPoolFactory.getRedisFactory(jedisConf);
        Jedis jedis=jedisPoolFactory.getJedis();

        jedis.set("username", "zzh");
        System.out.println(jedis.get("username"));

       System.out.println(jedis.dbSize());
       jedis.close(); 

}

*********************************

附加:jedis 事務操作 

   Transaction tran = jedis.multi(); 

   tran.del();

   tran.rpush();

相關推薦

redis客戶jedis基於spring搭建節點或者叢集執行連線

基於jedis執行緒池搭建單節點或叢集連線完整程式碼 <dependency>     <groupId>redis.clients</groupId>   <artifactId>jedis</artifactId&g

通過python實現TCP在客戶和伺服器上的(多)執行的程式設計

1、只支援一個客戶端訪問 伺服器: from socket import * address='127.0.0.1' #監聽哪些網路 127.0.0.1是監聽本機 0.0.0.0是監聽整個網路 port=12345 #監聽自己的哪個埠 buffsize=

SDR(spring.data.redis)與Sentinel高可用叢集Redis客戶Jedis配置

依賴 <dependency> <groupId>junit</groupId> <artifactId>junit<

Redis 客戶-Jedis

一、編碼實戰     1> 簡單使用 package org.jedisDomo; import redis.clients.jedis.Jedis; public class JedisDemo { public static void main(S

Redis 客戶Jedis使用---連線

Jedis 是Redis 的Java客戶端,通過一段時間的使用,jedis基本實現redis的所有功能,並且jedis在客戶端實現redis資料分片功能,Redis本身是沒有資料分佈功能。一、下載jedis 程式碼二、專案中如何使用Jedis使用現在大家都喜歡用maven作為

Redis 客戶 Jedis、lettuce 和 Redisson 對比

Redis 支援多種語言的客戶端,下面列舉了部分 Redis 支援的客戶端語言,大家可以通過[官網](https://redis.io/clients)檢視 Redis 支援的客戶端詳情。 - C語言 - C++ - C# - Java - [Python](https://redis.io/clients

基於TCP協議實現Linux下客戶與伺服器之間的通訊,實現多執行、多程序伺服器

TCP是TCP/IP協議族中一個比較重要的協議,這是一種可靠、建立連結、面向位元組流的傳輸,工作在傳輸層。和TCP相對的不可靠、無連結、面向資料報的協議UDP,瞭解UDP客戶端與伺服器之間通訊請戳UDP協議實現的伺服器與客戶端通訊 TCP協議建立連線 首

C#.網路程式設計 Socket基礎(四) WPF系統Socket TCP協議 伺服器與客戶 不同型別檔案傳輸,同時解決UI執行與工作執行的卡頓問題

一、簡介 雖然,本文的前面幾篇文章在WinForm中實現了Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸,詳情見 但是,卻沒有在WPF中實現 Socket TCP協議 伺服器與客戶端 不同型別檔案傳輸。因此,本文將描述如何在WPF中實現該功能。

在CentOS下,搭建節點以及叢集spark

在網上搜了一些關於Linux下搭建spark環境的一些文章,有的不能用,有的有些老舊,今天,對於在Linux搭建spark環境,做一些筆記 我用的VMWare12和centos7,以及jdk1.7,scala-2.11.6和預編譯的spark-1.5.2-bin-hadoo

Struts1,2,Servlet,Spring MVC例多例 執行安全

Struts 1 單例,執行緒不安全,在請求的時候被第一次初始化 action中的service物件為何不會出現資料儲存的錯誤,大體意思就是每一個使用者發出一次請求後就有一個獨立的執行緒與之繫結,且有一個對應的servlet例項,你在其之上做的操作只屬於當前

一個取消多生產者消費者的日誌執行服務

package concurrent._ThreadPool.logService; import net.jcip.annotations.GuardedBy; import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; import java.io.

Redis 客戶之Redisson 配置使用(基於Spring Boot 2.x)

開發環境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8 1.在專案的pom.xml檔案下,引入Redis和Redisson在Spring Boot 下的相關Jar包依賴。 <properties>

Redis 客戶之Lettuce配置使用(基於Spring Boot 2.x)

開發環境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8 Spring Boot 從 2.0版本開始,將預設的Redis客戶端Jedis替換問Lett

[ 搭建Redis本地服務器實踐系列三 ] :圖解Redis客戶工具連接Redis服務器

done not 必須 tin 復雜 start exe eas 方便 上一章 [ 搭建Redis本地服務器實踐系列二 ] :圖解CentOS7配置Redis 介紹了Redis的初始化腳本文件及啟動配置文件,並圖解如何以服務的形式來啟動、終止Redis服務,可以說我們的R

Jedis連線redis客戶

1 單點的redis利用jedis客戶端連線   如何連線 1 //1 利用jedis連線物件操作redis 2 @Test 3 public void test01(){ 4 //構造一個具有連線資訊的jedis物件 5 //確定虛擬機器linux系

通過jedis連線redis單機成功,使用redis客戶可以連線叢集,但使用JedisCluster連線redis叢集一直報Could not get a resource from th

原因是這個地方以前我沒註釋redis.conf檔案中的bind 127.0.0.1 然後做叢集時使用的命令是: ./redis-trib.rb create –replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.

Redis 的 java 客戶 jedis

Java 連線 MySql 我們有 mysql-connector ,連線 Redis 我們有 jedis。 一、引入依賴 <dependency> <groupId>redis.clients</groupId> <ar

Redis的java客戶Jedis Client介紹(持續翻譯中)

1. 概覽 This article is an introduction to Jedis, a client library in Java for Redis – the popular in-memory data structure store that can persis

redis客戶jedis和sharedJedis

前提:首先我們得區分2.x和3.x版本,因為3.x版本開始支援redis叢集 問題:那麼在2.x怎麼進行redis伺服器擴充套件 解決方式:橫向擴充套件(多個相互獨立的主從伺服器群) 伺服器搭建在此不進行敘述 那麼問題又來了,jedis在未叢集的情況下只能操作單r

[筆記遷移][Redis][8]Redis的Java客戶Jedis

一、連通性測試 //獲取一個Redis客戶端 Jedis jedisClient = new Jedis("192.168.109.191", 6379); //正常連線將返回PONG,若未關閉防火牆