你們好,我是redis學習的新人,今天寫這篇文章,但願記錄一下最近的學習 其實到如今我也不不知道redis具體能作什麼,大概是緩存,這個暫時無論,先實現我想要的結果。 這邊如何啓動redis不講了,請參考:http://www.runoob.com/redis/redis-tutorial.html redis是支持集羣的,因此須要配置redis集羣,總的來講,將下載的redis文件複製多份, 修改一下配置就能夠實現集羣,我本身的總結: 我把個人實例打了個包,但願對你們有幫助html
主從配置: 主服務器中的設置: 1:修改bind參數:綁定的服務器地址 (本地:127.0.0.1) 從服務器配置 1. 修改bing參數:綁定服務器地址 (注:不必定與主服務器在一塊兒) 2. 修改port參數:端口號 (注:若是在同一個服務器上,端口號不一樣來區分) 3. slaveof參數: 設置主服務器的地址以及端口號(設置master的Host以及Port) [注意: 須要頂格寫,不能有空格] ] 4. 若是主服務器設置了密碼,從服務器須要修改masterauth參數
配置好了主從服務器(從服務器只讀),嘗試一下,確實能夠實現值的同步git
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); JedisShardInfo shard1 = new JedisShardInfo("127.0.0.1", "6379"); JedisShardInfo shard2 = new JedisShardInfo("127.0.0.1", "6380"); shards.add(shard1); shards.add(shard2); JedisPoolConfig jpc = new JedisPoolConfig(); jpc.setMaxIdle(10); jpc.setMaxTotal(30); jpc.setMaxWaitMillis(3*1000); ShardedJedisPool sjPool = new ShardedJedisPool(jpc, shards); ShardedJedis jedis = sjPool.getResource(); jedis.set("temp", "heeloworld"); System.out.println("----"+jedis.get("temp")+"-----");
可是這樣還不夠,畢竟集羣真正做用是一個服務器掛了,其餘的能夠接着用 網上又看到「哨兵」(Redis-Sentinel),詳情請見:http://www.javashuo.com/article/p-vguqgocn-gw.html 所以本身作了一些嘗試,確實能夠實現該功能。redis
1.以前已經準備好了主從服務器多個,每一個裏面添加一個sentinel.conf的文件 2.文件的內容是 ####master sentinel.conf ##sentinel實例之間的通信端口 default 26379 port 36379 ####sentinel須要監控的master信息:<mastername> <masterIP> <masterPort> <quorum>. ####<quorum>應該小於集羣中slave的個數,只有當至少<quorum>個sentinel實例提交"master失效" 纔會認爲master爲ODWON("客觀"失效) . sentinel myid 45e995cdd93d2db1e48d563c8b3a4f69caf03274 ##**如下地址是主服務器地址,特別留意:主從切換後,此處的地址會改變喲** sentinel monitor mymaster 127.0.0.1 6379 1 sentinel down-after-milliseconds mymaster 1000 sentinel config-epoch mymaster 10
接下來就展現一下個人例子segmentfault
下兩張圖展現的是兩個服務器,一個是6379端口一個是6380端口, 經過info replication命令,能夠從role看出服務器的角色:master(主服務器),slave(從服務器) 再下面兩張是啓動sentinel監聽的畫面,所佔用的端口能夠修改sentinel.conf的port屬性
主從服務器都啓動,讀寫數據都沒有問題
這個時候,將主服務器關閉
這個時候注意從服務器的role從slave變成了master
最後讀取數據也沒有問題,並且獲取數據的服務器地址從6379,變成了6380, 說明咱們的功能實現了,主從切換,客戶端請求也切換到獲取最新的主服務數據
注意:想必你們也注意到個人代碼中的問題,前面我是用的ShardedJedisPool對象請求數據, 可是到後來,代碼裏使用的JedisSentinelPool,爲何會有這樣一個變化, 是由於ShardedJedisPool對象在主從服務器切換以後,就沒法請求到數據了, 可是JedisSentinelPool就能夠,具體原理我也不清楚。
最後,這是個人一點點見解,有不對的地方但願你們能夠提示我,畢竟我瞭解的很少, 在這裏但願大牛能夠給我些指導,在項目中如何使用redis,有沒有實例能夠給我學習學習,謝謝你們!