1. 程式人生 > >Redis叢集解決方案----JAVA應用

Redis叢集解決方案----JAVA應用

上篇文章 Redis叢集解決方案 已經已經介紹了Redis應用場景及效能、Redis單機部署以及叢集部署的操作,下面將講解如何使用JAVA客戶端呼叫搭建好的Redis叢集環境。

    先搭建一個Java工程JRedisUtils,匯入Redis3.0相應的jar,點選此處下載commons-pool2-2.4.2.jar jedis-3.0.0.jar jedis-3.0.0-javadoc.jar jedis-3.0.0-sources.jar)

   現在直接貼上程式碼:

package com.jredis.util;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


/**
 * Redis分散式呼叫API
 * @author pengtian
 * @Date 2016年11月17日18:10:52
 */
public class JRedisClient {
	
	
	
    private static String RESULT_OK = "OK";
	private static Set<HostAndPort> clusterNodes = null;
	private static JedisPoolConfig config = null;
	private static JedisCluster jedisCluster=null;
	
	private JRedisClient() {}  
    private static JRedisClient jredisClient=null;  
    //靜態工廠方法   
    public static synchronized  JRedisClient getInstance() {  
         if (jredisClient == null) {    
        	 jredisClient = new JRedisClient();  
        	 jredisClient.clusterInit();
         } else{
        	 System.out.println("JRedisClient已經實列化");
         }   
         return jredisClient;  
    }  
	
   /**
    * 獲取操作redis的客戶端
    * @return
    */
    public JedisCluster getJedisCluster(){
    	if(jedisCluster==null){
    		JRedisClient.getInstance();
    	}
    	return jedisCluster;
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*//JRedisClient jRedisClient =new JRedisClient("192.168.113.134",7006);
		System.out.println("set===>"+jRedisClient.set("key3", "key3333333333333333333"));
		System.out.println("get===>"+jRedisClient.get("key3"));*/
		
		JRedisClient jredisClient =JRedisClient.getInstance();
		jredisClient =JRedisClient.getInstance();
		/*System.out.println(jredisClient.set("FP_100000","FP_100000000000000"));
		System.out.println(jredisClient.get("FP_100000"));
		List<String> list = new ArrayList<String>();
		list.add("LIST1");
		list.add("LIST2");
		list.add("LIST3");
		jredisClient.list("LIST", 3600, list);*/
		
	/*	System.out.println("===>"+jredisClient.lrange("LIST", 0, -1));
		System.out.println("===>"+jredisClient.lrange("LIST", 0, 1));
		List<String> listGet = jredisClient.lrange("LIST",0, 2);
		for(int i=0;i<listGet.size();i++){
			System.out.println("===>"+listGet.get(i).toString());
		}
		*/
		for(int i=1;i<=10;i++){
			jredisClient.set("kEY_"+i,1000,i+"");
		}
		
		for(int i=1;i<=10;i++){
			System.out.println(i+"==>"+jredisClient.get("kEY_"+i));
		}
		
		/*for(int i=1;i<=10000;i++){
			System.out.println(i+"==>"+jredisClient.del("kEY_"+i));
		}*/
		
		/*TreeSet<String> keys = jredisClient.keys("kEY_*"); 
		if(keys.size()>0){  
		   System.out.println("SIZE:"+keys.size());  
		   for(String str:keys){
			   System.out.println("==============>"+str);   
		   }
		} else{
			System.out.println("No keys");  
		}*/
		

	}
	
	
	



	/**
	 * 配置Redis分散式節點
	 */
	private void genClusterNode() {
	    clusterNodes = new HashSet<HostAndPort>();
	    clusterNodes.add(new HostAndPort("192.168.113.133", 7000));
	    clusterNodes.add(new HostAndPort("192.168.113.133", 7011));
	    clusterNodes.add(new HostAndPort("192.168.113.133", 7001));
	    clusterNodes.add(new HostAndPort("192.168.113.134", 7006));
	    clusterNodes.add(new HostAndPort("192.168.113.134", 7007));
	    clusterNodes.add(new HostAndPort("192.168.113.131", 7009));
	    clusterNodes.add(new HostAndPort("192.168.113.131", 7008));
	}
	
	/**
	 * 實列化JRedis 執行緒池相關配置
	 */
	private void genJedisConfig() {
		 config = new JedisPoolConfig();
		 //pool 最大執行緒數
	     config.setMaxTotal(100000);
	     // 控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項。
	     config.setMaxIdle(100);
	     //表示當borrow(引入)一個jedis例項時,最大的等待時間,如果超過等待時間,則直接丟擲JedisConnectionException;
	     config.setMaxWaitMillis(180);
	     // 在borrow一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的;
	     config.setTestOnBorrow(true);
	}
	
    /**
     * JRedis分散式初始化
     */
	private void clusterInit() {
		if(jedisCluster == null){
			/*  配置Redis分散式節點 **/
		    genClusterNode();
		    /* 實列化JRedis 執行緒池相關配置 **/
		    genJedisConfig();
		    
		    jedisCluster = new JedisCluster(clusterNodes, 5000, config);
		}
	}
	
	
	/**
	 * 字串型別資料儲存
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean  set(String key, String value)
    {
		return this.set(key,0,value);
	}
	
	/**
	 * 字串資料型別儲存並設定有效期
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean  set(String key, int seconds,String value)
    {
		boolean isOk = false;
		String returnResult = "";
		if(seconds>0){
			returnResult= jedisCluster.setex(key, seconds, value);
		}else{
			returnResult = jedisCluster.set(key, value);
		}
		if(RESULT_OK.equals(returnResult)){
			isOk = true;
		}
		return isOk;
	}
    
	/**
	 * 獲取儲存的字串型別資料
	 * @param key
	 * @return
	 */
	public String get(String key) {
		return jedisCluster.get(key);
	}
	
	/**
	 * Map<String,String>型別資料儲存
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean hmset(String key, Map<String,String> hashMap){
		return this.hmset(key, 0, hashMap);
	}
	
	/**
	 * Map<String,String>型別資料儲存,並設定有效期
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean hmset(String key,int seconds, Map<String,String> hashMap){
		boolean isOk = false;
		String returnResult = "";
		returnResult = jedisCluster.hmset(key, hashMap);
		if(seconds>0){
		 this.expire(key, seconds);
		}
		if(RESULT_OK.equals(returnResult)){
			isOk = true;
		}
		return isOk;
	}
	/**
	 * 獲取Map中的指定KEY值
	 * @param key
	 * @param field
	 * @return String
	 */
	public String  hget(String key,String field){
		return jedisCluster.hget(key, field);
	}
	
	/**
	 * 獲取指定key中Map
	 * @param key
	 * @return Map
	 */
	public Map  hget(String key){
		return jedisCluster.hgetAll(key);
	}
	
	/**
	 * 計數遞增
	 * @param key
	 * @return
	 */
	public long incr(String key){
	
		return jedisCluster.incr(key);
	}
	
	/**
	 * 計數遞減
	 * @param key
	 * @return
	 */
	public long decr(String key){
		return 	jedisCluster.decr(key);
	}
	
	
	
	/**
	 * 設定KEY的有效期
	 * @param key
	 * @param seconds
	 * @return
	 */
	public long expire(String key,int seconds){
		return jedisCluster.expire(key, seconds);
	}
	
	/**
	 * 刪除指定KEY
	 * @param key
	 * @return
	 */
	public long del(String key){
		return jedisCluster.del(key);
	}
	
	/**
	 * 儲存List<String>資料
	 * @param key
	 * @param seconds
	 * @param list
	 */
	public long list(String key,List<String> list){
		return this.list(key, 0, list);
		
	}
	
	/**
	 * 儲存List<String>資料並設定有效期
	 * @param key
	 * @param seconds
	 * @param list
	 */
	public long list(String key,int seconds,List<String> list){
		long returnResult = 0;
		String[] strArray = null;
		if(list!=null&&!list.isEmpty()){
			strArray = new String[list.size()];
			for(int i=0;i<list.size();i++){
				strArray[i]=list.get(i).toString();
			}
		}
		returnResult = jedisCluster.lpush(key,strArray);
		if(seconds>0){
			 this.expire(key, seconds);
		}
		return returnResult;
	}
	
	/**
	 * 獲取List<String>
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<String> lrange(String key,long start,long end){
		return jedisCluster.lrange(key, start, end);
	}
	
	/**
	 * KEYS 獲取String資料型別的值
	 * @param pattern
	 * @return
	 */
    public TreeSet<String> keys(String pattern){  
        TreeSet<String> keys = new TreeSet<String>();  
        Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();  
        for(String k : clusterNodes.keySet()){  
            JedisPool jp = clusterNodes.get(k);  
            Jedis connection = jp.getResource();  
            try {  
                keys.addAll(connection.keys(pattern));  
            } catch(Exception e){  
            	e.printStackTrace();
            } finally{  
                connection.close();//用完一定要close這個連結!!!  
            }  
        }  
        return keys;  
    }  

	
	
 

}

單元執行Main函式,控制檯列印如下內容,代表搭建的Redis叢集正常:
JRedisClient已經實列化
1==>1
2==>2
3==>3
4==>4
5==>5
6==>6
7==>7
8==>8
9==>9
10==>10

接下來去Redis叢集中檢視下是否有資料:


相關推薦

Redis叢集解決方案----JAVA應用

上篇文章 Redis叢集解決方案 已經已經介紹了Redis應用場景及效能、Redis單機部署以及叢集部署的操作,下面將講解如何使用JAVA客戶端呼叫搭建好的Redis叢集環境。     先搭建一個Java工程JRedisUtils,匯入Redis3.0相應的jar,點選此處

RocketMQ叢集解決方案----JAVA應用

       上篇文章 RocketMQ叢集解決方案 已經講解了RocketMQ應用場景及效能、RocketMQ網路部署圖、實際叢集部署操作步驟(採用多Master多Slave,非同步複製叢集模式進行部署),這篇文章將講解JAVA應用中怎麼實際呼叫搭建的RocketMQ

大規模Redis叢集解決方案

1.為什麼要使用Redis叢集 一般的,為了提升網站及其他網路應用的響應能力,會將經常訪問的資料進行快取起來,而不是直接從後端資料庫裡面進行讀取。而目前市場上,Redis則是Cache的一個很好的解決方案,使用和部署很簡單,效能也非常不錯。但由於它是單執行緒單例項的服務,在

Redis 叢集解決方案比較

調研比較了三個Redis叢集的解決方案: 系統貢獻者是否官方Redis實現程式語言TwemproxyTwitter是CRedis ClusterRedis官方

Redis叢集解決方案codis

Codis 是一個分散式 Redis 解決方案, 對於上層的應用來說, 連線到 Codis Proxy 和連線原生的 Redis Server 沒有明顯的區別 (不支援的命令列表), 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發,

JAVA架構師課程(大資料,分散式事物解決方案,大型網際網路專案,大型金融專案,高併發叢集解決方案)實戰開發[技術 activeMQ,zookeeper,http,支付,團購,dubbox,stom]

在IT圈子裡,真正達到軟體架構師能力和水平的,一般的年薪在30-50w,甚至50w+,資深的或者高階的架構師,年薪在50-80萬,水平更高的,薪水也就更多了,可以稱得上是金領了。   因此,一直以來,有很多朋友都在朝軟體架構師這個方向努力發展。但由於沒有人領路,一些朋友

本地java連結遠端伺服器Linux上redis出錯解決方案

在redis.conf檔案中bind 127.0.0.1加上#號 在redis.conf檔案中把 #requirepass 的#號去掉,在後面加上鍊接redis-server的密碼 在本

Spring Session java連線redis 失敗解決方案

日誌提示連線拒絕, 是因為redis預設的protected-mode預設為yes 解決方案1: 進入redis-cli  輸入命令 CONFIG SET protected-mode no 解決方案2. 在redis目錄下的redis.conf配置檔案中增加 pr

Java客戶端訪問HBase叢集解決方案(優化)

測試環境:Idea+Windows10 準備工作:    <1>、開啟本地 C:\Windows\System32\drivers\etc(系統預設)下名為hosts的系統檔案,如果提示當前使用者沒有許可權開啟檔案;第一種方法是將hosts檔案拖到桌面進行配置

對服務器上所有Word文件做全文檢索的解決方案-Java

不可 servlet 並保存 保存文件 客戶端請求 打開文檔 word文檔 文件的 文本文件 一、背景介紹 Word文檔與日常辦公密不可分,在實際應用中,當某一文檔服務器中有很多Word文檔,假如有成千上萬個文檔時,用戶查找打開包含某些指定關鍵字的文檔就變得很困難,目

雲搜索服務在日誌解決方案應用

AD 智能 應用 如何 數字 開始 解決 follow href 在整體行業趨於數字化的今天,各種業務軟件每時每刻都在產生日誌數據。因為大數據的爆發,大家開始重視如何利用這些日誌,去解決業務上的難題。不可否認的是,隨著對數據資產的觀念興起,越來越多的運營人員和運維人員開始使

Linux上的叢集解決方案(mpi)

一、叢集和Linux上的叢集解決方案 叢集計算機是指用一組聯網的PC或工作站來搭建成的,提供比單個PC(節點)計算效能高得多的計算機。說其是計算機,其實是針對所提供出來的服務而言的,或者說是邏輯上來說的。叢集計算機的主要優勢就是成本,相同的計算能力下,其成本只有傳統大型機的十分之一,在全球計

redis叢集部署方案

1)     系統包安裝 配置作業系統yum 源安裝以下系統包 安裝gcc:yum install gcc 安裝zlib:yum install zib 安裝ruby:yum install ruby 2.0以上 安裝rubygems:yum install

深入學習Redis叢集搭建方案及實現原理

本文將詳細介紹叢集,主要內容包括: 叢集的作用 叢集的搭建方法及設計方案 叢集的基本原理 客戶端訪問叢集的方法 實踐須知(叢集伸縮、故障轉移、引數優化等) 叢集的作用 叢集,即 Redis Cluster,是 Redis

錯過血虧!深入學習Redis叢集搭建方案及實現原理

本文將詳細介紹叢集,主要內容包括:  ●  叢集的作用 ●  叢集的搭建方法及設計方案 ●  叢集的基本原理 ●  客戶端訪問叢集的方法  ●  實踐須知(叢集伸縮、故障轉移、引數優化等) 叢集的作用 叢集,即 Redis Cluster,是 Redis 3.0 開始

Redis叢集方案總結:客戶端Sharding/Redis Cluster/Proxy

一、Redis叢集 由於Redis出眾的效能,其在眾多的移動網際網路企業中得到廣泛的應用。Redis在3.0版本前只支援單例項模式,雖然現在的伺服器記憶體可以到100GB、200GB的規模,但是單例項模式限制了Redis沒法滿足業務的需求(例如新浪微博就曾經用R

redis叢集 官方方案redis-cluster搭建實戰

1.為什麼使用redis? redis是一種典型的no-sql 即非關係資料庫 像python的字典一樣 儲存key-value鍵值對 工作在memory中 所以很適合用來充當整個網際網路架構中各級之間的cache 比如lvs的4層轉發層 nginx的7層代理層 尤其是ln

Ping CAP CTO、Codis作者談redis分散式解決方案和分散式KV儲存

此文根據【QCON高可用架構群】分享內容,由群內【編輯組】志願整理,轉發請註明出處。 蘇東旭,Ping CAP CTO,Codis作者 開源專案Codis的co-author黃東旭,之前在豌豆莢從事infrastructure相關的工作。現在在創業

華為釋出ATAE叢集解決方案,為運營商實現網路系統集中管理

“華為,不僅僅是世界500強”——這個口號不知道是啥時候開始喊起的,就在美國以安全為由狙擊華為中興時,今天在C114上看到這篇文章,轉載過來分享給大家,原文如下: 全球領先的資訊與通訊解決方案供應商華為,近日釋出ATAE叢集解決方案。該方案是基於ATAE (Advanced Telecommunic

nginx 負載均衡叢集解決方案 healthcheck_nginx_upstreams (一)

 該文章來源於網際網路,目前找不到原作者,放在這裡的目的是記錄 的安裝過程和相關配置,在起初安裝成功後不能夠正常執行healthcheck_nginx_upstreams,後通過閱讀原始碼和除錯,能夠正常執行。 不過資訊如下: *26 no live upstreams while connec