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