最近項目中用到了redis,因此就找了相關的資料學習了,而後搭建了redis集羣,以及客戶端的java代碼實現。因爲對linux不太熟悉,因此在Linux上搭建redis集羣的時候碰到了不少問題,下面就大概總結下。java
redis相關網站:linux
官網: http://redis.io 中文網:http://www.redis.cn/ 文檔:http://redisdoc.com/redis
操做系統:centos 6.3spring
redis版本:3.0.6數據庫
java客戶端版本: jedis 2.7.2apache
redis客戶端圖形用戶界面:RedisDesktopManagerwindows
1.redis服務端集羣搭建步驟:centos
1.下載redis安裝包,進行解壓安裝安全
2.安裝ruby、rubygems install ruby ,安裝ruby的緣由是,在進行集羣的時候,使用的是ruby語言工具實現的,因此在集羣以前首先須要搭建ruby的環境ruby
3.在上述步驟完成以後,即可以搭建集羣環境,redis提供了兩種集羣搭建方法,執行腳本方法(安裝包下面的util包中)和手動搭建。
注意:
1.在集羣的時候,若是是遠端客戶端訪問redis服務端,那麼在分片的時候,須要使用Ip進行分片,下面會詳細說
2.在建立每一個節點的時候,不要只用redis-server ,使用絕對路徑下的redis-server xxx
具體的安裝步驟以下:http://blog.csdn.net/xu470438000/article/details/42971091
2.客戶端(java):
注意:
1.本文的客戶端使用的是java,官網中對於java客戶端也提供了很多的client,可是本文使用的是官方推薦的jedis。
2.在項目開發中,通常狀況下都會用到spring來管理應用,本文也是如此,spring 自己也提供了對redis的集成支持,具體的網址:http://projects.spring.io/spring-data-redis,
可是好像目前spring-data-redis不提供集羣的功能,因此本文沒有使用它,而是使用了原裝的jedis來進行開發,若是在項目中沒有用到集羣的功能,則可使用spirng-data-redis。
下面是具體的代碼實現
1.maven依賴
2.applicationContext.xml中的配置
3.JedisClusterFactory實現類
4.redis-config.properties文件
這是一個集羣環境,六個節點(不一樣端口),三個master ,三個slaver
5.項目目錄圖
6.代碼中使用(此代碼爲從redis中獲取相關信息)
ok,運行以後,會發現redis會根據不一樣的key,把它們放入到不一樣的節點中,以下圖
7.三個master節點中的數據
8.三個slave節點中的數據
實踐過程當中碰到的問題:
1.在一切準備好了以後,在操做redis的時候,卻報錯誤:Too many Cluster redirections
因爲,我是windows開發環境,在本機開了一個虛擬機,而後在虛擬機中搭建的linux集羣環境,本機的ip和虛擬機中的ip不相同,因此報這個錯誤,
解決方法:在redis集羣搭建過程當中,在爲每一個節點分hash槽的時候,執行以下代碼(其中,xxx爲集羣環境中的ip):
ok,以上知足使用,結束!!
-----------------------------------------------------------------------下面是我前一段時間看redis資料,總結的一些東東,記錄下來-------------------------------------------------------------------------------------------
1.redis是什麼?
redis(remote dictionary server):是一個以key-value形式存儲於內存中的數據庫.提供了 String / List / Set / Sort Set /Hash 五種數據結構。
服務器在斷電以後,仍然能夠恢復到斷電以前的狀態。
資料: 官網 : http://redis.io 中文網: http://www.redis.cn/ 相關文檔: http://redisdoc.com/
2.redis特色?
線程模型:單線程-多路複用io模型
性能高:支持讀 11萬/秒 , 寫 8萬/秒
存儲: 內存 ; RDB文件(二進制安全的真實數據) ; AOF文件(客戶端的命令集合)
事務: 支持事務(每一個客戶端串行執行命令,其餘客戶端處於阻塞狀態)
發佈/訂閱模式: 功能? 什麼場景使用??
3.redis數據類型
String:動態字符串(每一個key都是一個String)
編碼方式:int / raw() /embstr
應用場景:普通的string場景
List:列表結構,有序可重複的結構。它擁有隊列的特性。
編碼方式:ziplist / linkedlist (若是數據量較小,且是數字或者字符串,則內部結構爲 ziplist)
應用場景:普通的集合數據
Set:集合結構,不重複的集合結構。
編碼方式:intset(整數集合) / hashtable
應用場景:普通的非重複集合數據;支持取交集、取並集等操做
Sort Set:有序集合結構,和Set比較起來,它是有序的。
編碼方式:ziplist / skiplist
應用場景:有序不重複的集合數據
Hash:哈希結構,存儲多個key:value的結構,此種結構能夠存儲對象 ; 如 HMSET user(key) username value1 password value2
編碼方式:ziplist / hashtable
應用場景: 從關係型數據庫去出一條數據,就可讓入到此種結構中
4.內存優化
redis提供內存回收策略,根據使用的狀況能夠選擇適當的回收策略
redis提供內存共享策略,服務器啓動時,會自動建立0-9999的數字對象,其餘地方使用,能夠直接引用。
本質:對內存的操做,實際上是在每個redis對象結構內都有一個count的屬性,該屬性記錄了這個對象被引用的次數,若是爲0,那麼在內存回收時將回收該空間。
save參數調整:當知足條件時,觸發SAVE命令,持久化到RDB文件
appendonly參數: 默認no ,若yes,則開啓AOF文件持久化; BGREWRITEAOF 命令 持久化。其中appendsync參數調整具體的持久化策略,默認爲每秒
內存回收策略:
5.發佈訂閱模式
6.數據過時設置
能夠根據業務需求,將某些數據進行日期設置
7.事務
單線程處理全部客戶端發來的請求,因此當有一個客戶端在執行,其餘客戶端只能處於阻塞態。只有當前客戶端請求完畢,其餘客戶端才能請求
8.數據存儲
RDB文件模式(快照):該模式存儲的是真實數據,SAVE /BGSAVE 命令 能夠將內存中的數據存儲到磁盤文件中。SAVE和BGSAVE區別在於,SAVE是同步命令,
即當執行該命令,其餘客戶端處於阻塞狀態;而BGSAVE 命令則是開啓一個子進程處理,不會影響主進程操做。
AOF文件模式:該模式存儲的是服務器執行的命令集合,BGREWRITEAOF 命令。 該模式是appendonly參數控制,若打開,則會將數據同步到aof文件中
特色:該模式下,會在服務器端開闢一段緩衝內存來存儲最近時間單位的命令,因此該點要注意。一樣,它也是子進程進行執行
注意:AOF模式的更新頻率比RDB高,若開啓AOF模式的狀況下,優先載入AOF文件內容
9.數據恢復策略
若RDB模式開啓:重啓服務器只加載rdb文件內容
若AOF模式開啓:重啓服務器只加載aof文件內容
若二者都開啓:只加載aof文件內容
10主從複製
功能:數據備份,讀寫分離(測試環境,主服務器寫,從服務器讀)
步驟:在從服務端器執行: slaveof <masterip> <masterport> 便可維持關係;配置文件中也能夠
特色:
1.master能夠有多個slave
2.除了多個slave連到相同的master外,slave也能夠鏈接其餘slave造成圖狀結構
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時,master能夠繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞不能處理client的請求。
4.主從複製能夠用來提升系統的可伸縮性,咱們能夠用多個slave 專門用於client的讀請求,好比sort操做可使用slave來處理。也能夠用來作簡單的數據冗餘
5.能夠在master禁用數據持久化,只須要註釋掉master 配置文件中的全部save配置,而後只在slave上配置數據持久化。
6.主服務器能夠關閉持久化功能(註釋掉save參數)
11.sentinel(監測系統)
本質:是一個運行在特殊模式下的redis服務器。
功能:監控運行在多機上的主redis服務器,如有某一臺主服務器出現故障,將自動把其餘正常的從服務器切換爲主服務器,代替出現故障主服務器的工做。
特色:
1.不發揮數據庫的功能(全部對key以及數據類型操做的命令不能使用)
2.將會給監控的主服務器以及主服務器所屬的從服務器發送命令,確認是否下線
3.會和監控同一個主服務器的其餘sentinel服務器通訊,做用是在共同判斷所監控的主服務器的狀態
4.根據多個sentinel判斷的主服務器狀態,來決定是否要進行主從切換,故障轉移等
轉移:sentinel監控的主服務器配置參數要在 sentinel.conf 文件中配置,啓動時加載
具體配置安裝步驟:
1.http://blog.csdn.net/pi9nc/article/details/17735653
2.http://blog.csdn.net/luyee2010/article/details/9385155
12.集羣
功能:將衆多的key-value集合存在多個節點上,當某一個節點出現障礙,不影響整個集羣的功能。
涉及到的關鍵詞:
節點:一個端口的redis服務即是一個節點
槽指派(集羣將整個系統分爲16384個hash槽):這16384個槽位要所有分佈在集羣中的主節點上。
從新分片:若某個主節點故障了,將該主節點的槽位分配到其餘能夠用的主節點上。
上線/下線狀態: 是否所有的槽位都分佈在節點上。
特色:
1.若是某個節點要集羣,必需要設置cluster-enabled yes
2.每一個節點都有這16384個槽位所屬的節點信息,若是值沒有正確進入槽位,那麼該節點會提示系統將信息放入正確槽位。重定向的過程會出現一個面向客戶端隱藏的MOVED錯誤
3.集羣在線狀態也能夠進行從新分片
4.集羣中的主節點用戶處理客戶端命令,從節點用於複製主節點的數據,主節點下線時,從節點代替主節點的工做
//注意:目前官方提供的集羣功能仍處於內測版本。
13.redis基準
redis自帶的redis-benchmark 工具,支持各類參數進行性能測試
特色:
1.能夠模擬多個客戶端處理任意個請求
2.能夠測試僅僅少數使用的命令等
注意:測試發現,linux環境下部署的redis服務器性能遠高於windows下部署的redis服務器性能, 不在一個層級上面
14.關係數據庫模型的轉換
關係型數據庫表結構:user表 (uid username password birthday )
在redis中能夠這樣存在:
1.主鍵: SET user:uid 1 、 GET user:1
2.其餘字段:SET user:uid:username GET user:5:username ( 5 是經過參數值傳進來的)
3.表數據也能夠存在hash結構中: HMSET user:uid username value1 password value2 birthday value3
15.排序
16.管道
功能:客戶端一次能夠傳送多個命令到服務器,減小往返時延。大大提升性能。
17.優化
redis提供一些簡單的內存優化策略,如過時數據清除,內存數據共享,
18.持久化