Redis 是徹底開源免費的,是一個高性能的key-value數據庫。node
Redis 與其餘 key - value 緩存產品有如下三個特色:redis
Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。算法
Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。數據庫
Redis支持數據的備份,即master-slave模式的數據備份。centos
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s。緩存
wget http://download.redis.io/releases/redis-3.2.4.tar.gz安全
tar –zxvf redis-stable.tar.gz 解壓ruby
make 編譯服務器
可能出現問題make[3]: gcc: Command not found,未安裝gcc編譯工具數據結構
編譯成功後,進入src文件夾,執行make install進行Redis安裝
make install --> /usr/local/bin目錄下有:redis-server,redis-cli,redis-check-aof,redis-check-dump
redis-server –v 檢查是否安裝成功
啓動redis,進入到redis.conf目錄,執行
redis-server redis.conf. 若是後面沒有跟redis.conf則按照默認配置啓動
redis.conf 配置項說明以下:
1. Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程
daemonize yes
2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis監聽端口,默認端口爲6379,做者在本身的一篇博文中解釋了爲何選用6379做爲默認端口,由於6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 綁定的主機地址
bind 127.0.0.1 這個Ip要設置成你服務器的Ip
5.當 客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能
timeout 300
6. 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
loglevel verbose
7. 日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
logfile stdout
8. 設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id
databases 16
9. 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
save <seconds> <changes>
Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
10. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大
rdbcompression yes
11. 指定本地數據庫文件名,默認值爲dump.rdb
dbfilename dump.rdb
12. 指定本地數據庫存放目錄
dir ./
13. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
slaveof <masterip> <masterport>
14. 當master服務設置了密碼保護時,slav服務鏈接master的密碼
masterauth <master-password>
15. 設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉
requirepass foobared
16. 設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息
maxclients 128
17. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
maxmemory <bytes>
18. 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no
appendonly no
19. 指定更新日誌文件名,默認爲appendonly.aof
appendfilename appendonly.aof
20. 指定更新日誌條件,共有3個可選值:
no:表示等操做系統進行數據緩存同步到磁盤(快)
always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)
everysec:表示每秒同步一次(折衷,默認值)
appendfsync everysec
21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)
vm-enabled no
22. 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
vm-swap-file /tmp/redis.swap
23. 將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0
vm-max-memory 0
24. Redis swap文件分紅了不少的page,一個對象能夠保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值
vm-page-size 32
25. 設置swap文件中的page數量,因爲頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。
vm-pages 134217728
26. 設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲4
vm-max-threads 4
27. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
glueoutputbuf yes
28. 指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹)
activerehashing yes
30. 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件
include /path/to/local.conf
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String:
Get、set。注意:一個鍵最大能存儲512MB。
Hash:
Hmset、hmget、hkeys、hvals
List:
Lpush、lrange
Set
sadd、smembers
zset
ZADD 集合名 序號 集合元素
zadd myZSet 1 zlh
zadd mySet 2 Tom 3 Jim
zcard myZSet 查看zset集合的成員個數
zrange mZySet 0 -1
zrange mZySet 0 -1 withscores
zrank mZySet Jim 獲取zset成員的下標位置
zcount mySet 1 3
zrem myZSet zlh 刪除指定的一個成員或多個成員
zscore myZset zlh
zincrby myZset 4 tom tom的分數值加4
zrangebyscore myZset 1 5
Redis 發佈訂閱(pub/sub)是一種消息通訊模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
subscribe dongnao 客戶端訂閱消息,dongnao爲相應的頻道
publish dongnao message 發佈消息,同時訂閱該頻道的客戶端能收到該消息
Redis 事務能夠一次執行多個命令, 而且帶有如下兩個重要的保證:
事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。
事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。
一個事務從開始到執行會經歷如下三個階段:
開始事務。
命令入隊。
執行事務。
MULTI 開始一個事物
Set dongnao jack
Get dongnao
Hmset map key1 value1 key2 value2
Hmget map key1
Exec 執行事物
默認狀況下 每隔一段時間redis服務器程序會自動對數據庫作一次遍歷,把內存快照寫在一個叫作「dump.rdb」的文件裏,這個持久化機制叫作SNAPSHOT。有了SNAPSHOT後,若是服務器宕機,從新啓動redis服務器程序時redis會自動加載dump.rdb,將數據庫狀態恢復到上一次作SNAPSHOT時的狀態。
手動進行內存備份:
Save
config get requirepass 獲取密碼
config set requirepass 123
config get requirepass
auth password 密碼驗證
RDB
快照是默認的持久化方式。這種方式是就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。能夠經過配置設置自動作快照持久化的方式。咱們能夠配置redis在n秒內若是超過m個key被修改就自動作快照,下面是默認的快照保存配置:
save 900 1 #900秒內若是超過1個key被修改,則發起快照保存
save 300 10 #300秒內容如超過10個key被修改,則發起快照保存
save 60 10000
client 也可使用save或者bgsave命令通知redis作一次快照持久化,每次快照持久化都是將內存數據完整寫入到磁盤一次,並非增量的只同步髒數據。若是數據量大的話,並且寫操做比較多,必然會引發大量的磁盤io操做,可能會嚴重影響性能。另外因爲快照方式是在必定間隔時間作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改。
AOF
redis會將每個收到的寫命令都經過write函數追加到文件中(默認是appendonly.aof)。當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。
appendonly yes #啓用aof持久化方式
# appendfsync always #每次收到寫命令就當即強制寫入磁盤,最慢的,可是保證徹底的持久化,不推薦使用
appendfsync everysec #每秒鐘強制寫入磁盤一次,在性能和持久化方面作了很好的折中,推薦
# appendfsync no #徹底依賴os,性能最好,持久化沒保證
redis主從複製過程: 當配置好slave後,slave與master創建鏈接,而後發送sync命令。不管是第一次鏈接仍是從新鏈接,master都會啓動一個後臺進程,將 數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存。後臺進程完成寫文件後,master就發送文件給slave,slave將 文件保存到硬盤上,再加載到內存中,接着master就會把緩存的命令轉發給slave,後續master將收到的寫命令發送給slave。若是master同時收到多個slave發來的同步鏈接命令,master只會啓動一個進程來寫數據庫鏡像,而後發送給全部的slave。master同步數據時是非阻塞式的,能夠接收用戶的讀寫請求。然而在slave端是阻塞模式的,slave在同步master數據時,並不可以響應客戶端的查詢。
能夠在master禁用數據持久化,只須要註釋掉master 配置文件中的全部save配置,而後只在slave上配置數據持久化
Redis 集羣中內置了 16384 個哈希槽,當須要在 Redis 集羣中放置一個 key-value時,redis 先對 key 使用 crc16 算法算出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大體均等的將哈希槽映射到不一樣的節點。集羣的每一個節點負責一部分hash槽。這種結構很容易添加或者刪除節點,而且不管是添加刪除或者修改某一個節點,都不會形成集羣不可用的狀態。使用哈希槽的好處就在於能夠方便的添加或移除節點。當須要增長節點時,只須要把其餘節點的某些哈希槽挪到新節點就能夠了;當須要移除節點時,只須要把移除節點上的哈希槽挪到其餘節點就好了;在這一點上,咱們之後新增或移除節點的時候不用先停掉全部的 redis 服務。Hash slots
基於centos的集羣
一、集羣至少要有3個節點,每一個節點都有主從結構
新建三個文件夾,把配置文件cp進去,而後修改配置文件端口,把支持集羣配置放開,啓動該節點
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
二、安裝ruby,必須2.0以上,2.0以上自帶rubygems包管理器
yum install ruby
三、gem命令安裝redis包,增長redis-trib.rb調用redis的接口包
gem install redis
四、用redis-trib.rb集羣工具管理redis集羣
./redis-trib.rb create --replicas 1 120.77.22.187:7000 120.77.22.187:8000 120.77.22.187:9000 120.77.22.187:7010 120.77.22.187:8010 120.77.22.187:9010
--replicas 1 設置從節點個數
進入集羣模式去操做redis命令,-c集羣模式
redis-cli -c -h –p
主要是看現象,slots轉移時,對應數據會有什麼變化?
增長節點
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
查看節點狀況
cluster nodes
移動哈希槽,哈希槽從新分配
./redis-trib.rb reshard 127.0.0.1:7000
輸入all 表示從全部的主節點中隨機轉移,湊夠xx個哈希槽
把hash slots轉出來,轉到其餘master節點上
./redis-trib.rb reshard 127.0.0.1:7000
而後刪除節點
./redis-trib.rb del-node 120.77.22.187:9020 94ee1415a16076f4070c5dd4b94defc14618dbb8
Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis作Master-slave的高可用方案時,假如master宕機了,Redis自己(包括它的不少客戶端)都沒有實現自動進行主備切換,而Redis-sentinel自己也是一個獨立運行的進程,它能監控多個master-slave集羣,發現master宕機後能進行自動切換。
它的主要功能有如下幾點
不時地監控redis是否按照預期良好地運行;
若是發現某個redis節點運行出現情況,可以通知另一個進程(例如它的客戶端);
可以進行自動切換。當一個master節點不可用時,可以選舉出master的多個slave(若是有超過一個slave的話)中的一個來做爲新的master,其它的slave節點會將它所追隨的master的地址改成被提高爲master的slave的新地址。
須要注意的是,配置文件在sentinel運行期間是會被動態修改的,例如當發生主備切換時候,配置文件中的master會被修改成另一個slave。這樣,以後sentinel若是重啓時,就能夠根據這個配置來恢復其以前所監控的redis集羣的狀態。
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 60000
#sentinel can-failover mymaster yes
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
當sentinel集羣式,解決這個問題的方法就變得很簡單,只須要多個sentinel互相溝通來確認某個master是否真的死了,這個2表明,當集羣中有2個sentinel認爲master死了時,才能真正認爲該master已經不可用了。
down-after-milliseconds
sentinel會向master發送心跳PING來確認master是否存活,若是master在「必定時間範圍」內不迴應PONG 或者是回覆了一個錯誤消息,那麼這個sentinel會主觀地(單方面地)認爲這個master已經不可用了(subjectively down, 也簡稱爲SDOWN)。而這個down-after-milliseconds就是用來指定這個「必定時間範圍」的,單位是毫秒。
can-failover
no 表示當前sentinel是一個觀察者,只參與投票不參與實施failover
全局中至少有一個是yes
parallel-syncs
當新master產生時,同時進行「slaveof」到新master並進行「SYNC」的slave個數
默認爲1,建議保持默認值
在salve執行salveof與同步時,將會終止客戶端請求
failover-timeout
failover過時時間,當failover開始後,在此時間內仍然沒有觸發任何failover操做
當前sentinel將會認爲這次failoer失敗