Redis 簡介
Remote Dictionary Server(Redis)是一個開源的使用 ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。前端
它一般被稱爲數據結構服務器,由於值(value)能夠是
字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。node
優勢:mysql
- 支持多種數據結構,如 string(字符串)、 list(雙向鏈表)、dict(hash 表)、set(集合)、zset(排序 set)、hyperloglog(基數估算)
- 支持持久化操做,能夠進行 aof 及 rdb 數據持久化到磁盤,從而進行數據備份或數據恢復等操做,較好的防止數據丟失的手段。
- 支持經過 Replication 進行數據複製,經過 master-slave 機制,能夠實時進行數據的同步複製,支持多級複製和增量複製,master-slave 機制是 Redis 進行 HA 的重要手段。
- 單進程請求,全部命令串行執行,併發狀況下不須要考慮數據一致性問題。
安裝 Redis 單機版
第一步 須要在 linux 系統中安裝 gcc
命令:yum install -y gcc-c++linux
第二步 須要將下載好的 redis 壓縮包添加到 linux 服務器中
版本:redis-3.0.0.tar.gz
redis 的版本:副版本號奇數版本號是測試版,不建議在生產環境中使用。
偶數版本時穩定版建議在生產環境中使用。
3.0 版本更新比較大。集成了集羣技術c++
第三步 解壓壓縮包
命令:tar -zxvf redis…redis
第四步 編譯 redis
命令:進入 redis 的解壓完畢的根目錄下 執行命令:make算法
第五步 安裝 redis
命 令 : 進 入 redis 的 解 壓 完 畢 的 根 目 錄 下 ,
執 行 命 令 : make installPREFIX=/usr/local/redissql
第六步:啓動 redis
1,前端啓動
在 bin 目錄下執行命令: ./redis-server (ctrl+c)退出 redismongodb
2.後端啓動
(1)先將 redis 解壓目錄下的 redis.conf 文件拷貝到 安裝好的 redis 的 bin 目錄下
命令:cp redis.conf /usr/local/redis/bin數據庫
(2)修改拷貝過來的 redis.conf 配置文件
命令:vim redis.conf
將 daemonize no 改成 yes
(3)啓動 redis
在 bin 目錄下執行命令:./redis-server redis.conf
(4)查看 redis 啓動是否成功
輸入命令:ps aux|grep redis
(5) 關閉 redis 的命令
./redis-cli shutdown
第七步:測試 redis
在 bin 目錄下啓動 redis 自帶的客戶端 ./redis-cli
常見 redis 命令:
ping—>pong
Redis 數據類型
1 String(字符串)
Redis 字符串是字節序列。Redis 字符串是二進制安全的,這意味着他們有一個已知的長度沒有任何特殊字符終止,因此你能夠存儲任何東西,512 兆爲上限
示例:
redis 127.0.0.1:6379> SET name kevin
OK
redis 127.0.0.1:6379> GET name
「kevin」
incr 讓當前鍵值以 1 的數量遞增,並返回遞增後的值
incrby 能夠指定參數一次增長的數值,並返回遞增後的值
decr 讓當前鍵值以 1 的數量遞減 並返回遞減後的值
decrby 能夠指定參數一次遞減的數值,並返回遞減後的值
incrbyfloat 能夠遞增一個雙精度浮點數
append 做用是向鍵值的末尾追加 value。若是鍵不存在則將該鍵的值設置爲 value。返回值是追加後字符串的總長度。
mget/mset 做用與 get/set 類似,不過 mget/mset 能夠同時得到/設置多個鍵的鍵值
del 根據 key 來刪除 value
flushdb 清除當前庫的全部數據
Redis 的哈希是鍵值對的集合。 Redis 的哈希值是字符串字段和字符串值之間的映射,所以它們被用來表示對象。
示例:
redis 127.0.0.1:6379> HSET key field value
OK
redis 127.0.0.1:6379> HGET key field
value
hset 存儲一個哈希鍵值對的集合
hset key field value
hget 獲取一個哈希鍵的值
hget key field
hmset 存儲一個或多個哈希是鍵值對的集合
hmset key field1 value1 …fieldN keyN
hmget 獲取多個指定的鍵的值
hmget key field1 … fieldN
hexists 判斷哈希表中的字段名是否存在 若是存在返回 1 不然返回 0
hexists key field
hdel 刪除一個或多個字段
hdel key field
hgetall 獲取一個哈希是鍵值對的集合
hgetall key
hvals 只返回字段值
hvals key
hkeys 只返回字段名
hkeys key
hlen 返回 key 的 hash 的元素個數
hlen key
Redis 的鏈表是簡單的字符串列表,排序插入順序。您能夠添加元素到 Redis 的列表的頭部或尾部
示例:
redis 127.0.0.1:6379> lpush tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> lpush tutoriallist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush tutoriallist rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange tutoriallist 0 10
- 「rabitmq」
- 「mongodb」
- "redis
lpush key value 向鏈表左側添加
rpush key value 向鏈表右側添加
lpop key 從左邊移出一個元素
rpop key 從右邊移出一個元素
llen key 返回鏈表中元素的個數 至關於關係型數據庫中 select count(*)
lrange key start end lrange 命令將返回索引從 start 到 stop 之間的全部元素。Redis 的列表起始索引爲 0。
lrange 也支持負索引 lrange nn -2 -1 如 -1 表示最右邊第一個元素 -2 表示最右邊第二個元素,依次類推。
lindex key indexnumber 若是要將列表類型當作數組來用,lindex 命令是必不可少的。
lindex 命令用來返回指定索引的元素,索引從 0 開始若是是負數表示從右邊開始計算的索引,最右邊元素的索引是-1。
Lset key indexnumber value 是另外一個經過索引操做列表的命令,它會將索引爲 index的元素賦值爲 value。
Redis 的集合是字符串的無序集合。
示例:
redis 127.0.0.1:6379> sadd tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist mongodb
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers tutoriallist
- 「rabitmq」
- 「mongodb」
- 「redis」
sadd key value 添加一個 string 元素到,key 對應的 set 集合中,成功返回 1,若是元素已經在集合中返回 0
scard key 返回 set 的元素個數,若是 set 是空或者 key 不存在返回 0
smembers key 返回 key 對應 set 的全部元素,結果是無序的
sismember key value 判斷 value 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存
在
srem key value 從 key 對應 set 中移除給定元素,成功返回 1,若是 value 在集合中不存
在或者 key 不存在返回 0
SortedSet(有序集合)zset
Redis 的有序集合相似於 Redis 的集合,字符串不重複的集合。
示例:
redis 127.0.0.1:6379> zadd tutoriallist 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000
- 「redis」
- 「mongodb」
- 「rabitmq」
zadd key score value 將一個或多個 value 及其 socre 加入到 set 中
zrange key start end 0 和-1 表示從索引爲 0 的元素到最後一個元素(同 LRANGE 命令類似)
zrange key 0 -1 withscores 也能夠連同 score 一塊輸出,使用 WITHSCORES 參數
zremrangebyscore key start end 可用於範圍刪除操做
Redis 中的其餘命令
ping 測試 redis 是否連接 若是已連接返回 PONG
echo value 測試 redis 是否連接 若是已連接返回 echo 命令後給定的值
keys * 返回全部的 key 能夠加*通配
exists key 判斷 string 類型一個 key 是否存在 若是存在返回 1 不然返回 0
expire key time(s) 設置一個 key 的過時時間 單位秒。時間到達後會刪除 key 及 value
ttl key 查詢已設置過時時間的 key 的剩餘時間 若是返回-2 表示該鍵值對已經被刪除
persist 移除給定 key 的過時時間
select dbindex 選擇數據庫(0-15)
move key dbIndex 將當前數據庫中的 key 轉移到其餘數據庫中
dbsize 返回當前數據庫中的 key 的數目
info 獲取服務器的信息和統計
flushdb 刪除當前選擇的數據庫中的 key
flushall 刪除全部數據庫中的全部 key
quit 退出鏈接
Redis 的配置以及持久化方案
redis.conf 文件:
#redis.conf # Redis configuration file example. # ./redis-server /path/to/redis.conf ################################## INCLUDES ################################### #這在你有標準配置模板可是每一個 redis 服務器又須要個性設置的時候頗有用。 # include /path/to/local.conf # include /path/to/other.conf ################################ GENERAL ##################################### #是否在後臺執行,yes:後臺運行;no:不是後臺運行(老版本默認) daemonize yes #3.2 裏的參數,是否開啓保護模式,默認開啓。要是配置裏沒有指定 bind 和密碼。開啓該參數後,redis 只會本地進行訪問,拒絕外部訪問。要是開啓了密碼 和 bind,能夠開啓。否 則最好關閉,設置爲 no。 protected-mode yes #redis 的進程文件 pidfile /var/run/redis/redis-server.pid #redis 監聽的端口號。 port 6379 #此參數肯定了 TCP 鏈接中已完成隊列(完成三次握手以後)的長度, 固然此值必須不大於 Linux 系統定 義的/proc/sys/net/core/somaxconn 值,默認是 511,而 Linux 的默認參數值是 128。當系統並 髮量大而且客戶端速度緩慢的時候,能夠將這二個參數一塊兒參考設定。該內核參數默認值通常是 128,對 於負載很大的服務程序來講大大的不夠。通常會將它修改成 2048 或者更大。在/etc/sysctl.conf 中 添加:net.core.somaxconn = 2048,而後在終端中執行 sysctl -p。 tcp-backlog 511 #指定 redis 只接收來自於該 IP 地址的請求,若是不進行設置,那麼將處理全部請求 #bind 127.0.0.1 #配置 unix socket 來讓 redis 支持監聽本地鏈接。 # unixsocket /var/run/redis/redis.sock #配置 unix socket 使用文件的權限 # unixsocketperm 700 # 此參數爲設置客戶端空閒超過 timeout,服務端會斷開鏈接,爲 0 則服務端不會主動斷開鏈接,不能 小於 0。 timeout 0 #tcp keepalive 參數。若是設置不爲 0,就使用配置 tcp 的 SO_KEEPALIVE 值,使用 keepalive 有 兩個好處:檢測掛掉的對端。下降中間設備出問題而致使網絡看似鏈接卻已經與對端端口的問題。在 Linux 內核中,設置了 keepalive,redis 會定時給對端發送 ack。檢測到對端關閉須要兩倍的設置值。 tcp-keepalive 0 #指定了服務端日誌的級別。級別包括:debug(不少信息,方便開發、測試),verbose(許多有用的 信息,可是沒有 debug 級別信息多),notice(適當的日誌級別,適合生產環境),warn(只有很是重 要的信息) loglevel notice #指定了記錄日誌的文件。空字符串的話,日誌會打印到標準輸出設備。後臺運行的 redis 標準輸出是 /dev/null。 logfile /var/log/redis/redis-server.log #是否打開記錄 syslog 功能 # syslog-enabled no #syslog 的標識符。 # syslog-ident redis #日誌的來源、設備 # syslog-facility local0 #數據庫的數量,默認使用的數據庫是 DB 0。能夠經過」SELECT 「命令選擇一個 db databases 16 ################################ SNAPSHOTTING ################################ # 快照配置 # 註釋掉「save」這一行配置項就可讓保存數據庫功能失效 # 設置 sedis 進行數據庫鏡像的頻率。 # 900 秒(15 分鐘)內至少 1 個 key 值改變(則進行數據庫保存--持久化) # 300 秒(5 分鐘)內至少 10 個 key 值改變(則進行數據庫保存--持久化) # 60 秒(1 分鐘)內至少 10000 個 key 值改變(則進行數據庫保存--持久化) save 900 1 save 300 10 save 60 10000 #當 RDB 持久化出現錯誤後,是否依然進行繼續進行工做,yes:不能進行工做,no:能夠繼續進行工做, 能夠經過 info 中的 rdb_last_bgsave_status 瞭解 RDB 持久化是否有錯誤 stop-writes-on-bgsave-error yes #使用壓縮 rdb 文件,rdb 文件壓縮使用 LZF 壓縮算法,yes:壓縮,可是須要一些 cpu 的消耗。no:不 壓縮,須要更多的磁盤空間 rdbcompression yes #是否校驗 rdb 文件。從 rdb 格式的第五個版本開始,在 rdb 文件的末尾會帶上 CRC64 的校驗和。這跟 有利於文件的容錯性,可是在保存 rdb 文件的時候,會有大概 10%的性能損耗,因此若是你追求高性能, 能夠關閉該配置。 rdbchecksum yes #rdb 文件的名稱 dbfilename dump.rdb #數據目錄,數據庫的寫入會在這個目錄。rdb、aof 文件也會寫在這個目錄 dir /root/temp ################################# REPLICATION ################################# #複製選項,slave 複製對應的 master。 # slaveof <masterip> <masterport> #若是 master 設置了 requirepass,那麼 slave 要連上 master,須要有 master 的密碼才行。 masterauth 就是用來配置 master 的密碼,這樣能夠在連上 master 後進行認證。 # masterauth <master-password> #當從庫同主機失去鏈接或者複製正在進行,從機庫有兩種運行方式:1) 若是 slave-serve-stale-data 設置爲 yes(默認設置),從庫會繼續響應客戶端的請求。2) 若是 slave-serve-stale-data 設置爲 no,除去 INFO 和 SLAVOF 命令以外的任何請求都會返回一個錯 誤」SYNC with master in progress」。 slave-serve-stale-data yes #做爲從服務器,默認狀況下是隻讀的(yes),能夠修改爲 NO,用於寫(不建議)。 slave-read-only yes #是否使用 socket 方式複製數據。目前 redis 複製提供兩種方式,disk 和 socket。若是新的 slave 連上來或者重連的 slave 沒法部分同步,就會執行全量同步,master 會生成 rdb 文件。有 2 種方式: disk 方式是 master 建立一個新的進程把 rdb 文件保存到磁盤,再把磁盤上的 rdb 文件傳遞給 slave。 socket 是 master 建立一個新的進程,直接把 rdb 文件以 socket 的方式發給 slave。disk 方式的時 候,當一個 rdb 保存的過程當中,多個 slave 都能共享這個 rdb 文件。socket 的方式就的一個個 slave 順序複製。在磁盤速度緩慢,網速快的狀況下推薦用 socket 方式。 repl-diskless-sync no #diskless 複製的延遲時間,防止設置爲 0。一旦複製開始,節點不會再接收新 slave 的複製請求直到 下一個 rdb 傳輸。因此最好等待一段時間,等更多的 slave 連上來。 repl-diskless-sync-delay 5 #slave 根據指定的時間間隔向服務器發送 ping 請求。時間間隔能夠經過 repl_ping_slave_period 來設置,默認 10 秒。 # repl-ping-slave-period 10 #複製鏈接超時時間。master 和 slave 都有超時時間的設置。master 檢測到 slave 上次發送的時間超 過 repl-timeout,即認爲 slave 離線,清除該 slave 信息。slave 檢測到上次和 master 交互的時 間超過 repl-timeout,則認爲 master 離線。須要注意的是 repl-timeout 須要設置一個比 repl-ping-slave-period 更大的值,否則會常常檢測到超時。 # repl-timeout 60 #是否禁止複製 tcp 連接的 tcp nodelay 參數,可傳遞 yes 或者 no。默認是 no,即便用 tcp nodelay。 若是 master 設置了 yes 來禁止 tcp nodelay 設置,在把數據複製給 slave 的時候,會減小包的數量 和更小的網絡帶寬。可是這也可能帶來數據的延遲。默認咱們推薦更小的延遲,可是在數據量傳輸很大的 場景下,建議選擇 yes。 repl-disable-tcp-nodelay no #複製緩衝區大小,這是一個環形複製緩衝區,用來保存最新複製的命令。這樣在 slave 離線的時候,不 須要徹底複製 master 的數據,若是能夠執行部分同步,只須要把緩衝區的部分數據複製給 slave,就能 恢復正常複製狀態。緩衝區的大小越大,slave 離線的時間能夠更長,複製緩衝區只有在有 slave 鏈接 的時候才分配內存。沒有 slave 的一段時間,內存會被釋放出來,默認 1m。 # repl-backlog-size 5mb #master 沒有 slave 一段時間會釋放複製緩衝區的內存,repl-backlog-ttl 用來設置該時間長度。 單位爲秒。 # repl-backlog-ttl 3600 #當 master 不可用,Sentinel 會根據 slave 的優先級選舉一個 master。最低的優先級的 slave,當 選 master。而配置成 0,永遠不會被選舉。 slave-priority 100 #redis 提供了可讓 master 中止寫入的方式,若是配置了 min-slaves-to-write,健康的 slave 的個數小於 N,mater 就禁止寫入。master 最少得有多少個健康的 slave 存活才能執行寫命令。這個配 置雖然不能保證 N 個 slave 都必定能接收到 master 的寫操做,可是能避免沒有足夠健康的 slave 的時 候,master 不能寫入來避免數據丟失。設置爲 0 是關閉該功能。 # min-slaves-to-write 3 #延遲小於 min-slaves-max-lag 秒的 slave 才認爲是健康的 slave。 # min-slaves-max-lag 10 # 設置 1 或另外一個設置爲 0 禁用這個特性。 # Setting one or the other to 0 disables the feature. # By default min-slaves-to-write is set to 0 (feature disabled) and # min-slaves-max-lag is set to 10. ################################## SECURITY ################################### #requirepass 配置可讓用戶使用 AUTH 命令來認證密碼,才能使用其餘命令。這讓 redis 可使用 在不受信任的網絡中。爲了保持向後的兼容性,能夠註釋該命令,由於大部分用戶也不須要認證。使用 requirepass 的時候須要注意,由於 redis 太快了,每秒能夠認證 15w 次密碼,簡單的密碼很容易被 攻破,因此最好使用一個更復雜的密碼。 # requirepass foobared #把危險的命令給修改爲其餘名稱。好比 CONFIG 命令能夠重命名爲一個很難被猜到的命令,這樣用戶不 能使用,而內部工具還能接着使用。 # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 #設置成一個空的值,能夠禁止一個命令 # rename-command CONFIG "" ################################### LIMITS #################################### # 設置能連上 redis 的最大客戶端鏈接數量。默認是 10000 個客戶端鏈接。因爲 redis 不區分鏈接是客 戶端鏈接仍是內部打開文件或者和 slave 鏈接等,因此 maxclients 最小建議設置到 32。若是超過了 maxclients,redis 會給新的鏈接發送’max number of clients reached’,並關閉鏈接。 # maxclients 10000 #redis 配置的最大內存容量。當內存滿了,須要配合 maxmemory-policy 策略進行處理。注意 slave 的輸出緩衝區是不計算在 maxmemory 內的。因此爲了防止主機內存使用完,建議設置的 maxmemory 需 要更小一些。 # maxmemory <bytes> #內存容量超過 maxmemory 後的處理策略。 #volatile-lru:利用 LRU 算法移除設置過過時時間的 key。 #volatile-random:隨機移除設置過過時時間的 key。 #volatile-ttl:移除即將過時的 key,根據最近過時時間來刪除(輔以 TTL) #allkeys-lru:利用 LRU 算法移除任何 key。 #allkeys-random:隨機移除任何 key。 #noeviction:不移除任何 key,只是返回一個寫錯誤。 #上面的這些驅逐策略,若是 redis 沒有合適的 key 驅逐,對於寫命令,仍是會返回錯誤。redis 將不 再接收寫請求,只接收 get 請求。寫命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。 # maxmemory-policy noeviction #lru 檢測的樣本數。使用 lru 或者 ttl 淘汰算法,從須要淘汰的列表中隨機選擇 sample 個 key,選出 閒置時間最長的 key 移除。 # maxmemory-samples 5 ############################## APPEND ONLY MODE ############################### #默認 redis 使用的是 rdb 方式持久化,這種方式在許多應用中已經足夠用了。可是 redis 若是中途宕 機,會致使可能有幾分鐘的數據丟失,根據 save 來策略進行持久化,Append Only File 是另外一種持 久化方式,能夠提供更好的持久化特性。Redis 會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時 Redis 都會先把這個文件的數據讀入內存裏,先忽略 RDB 文件。 appendonly no #aof 文件名 appendfilename "appendonly.aof" #aof 持久化策略的配置 #no 表示不執行 fsync,由操做系統保證數據同步到磁盤,速度最快。 #always 表示每次寫入都執行 fsync,以保證數據同步到磁盤。 #everysec 表示每秒執行一次 fsync,可能會致使丟失這 1s 數據。 appendfsync everysec # 在 aof 重寫或者寫入 rdb 文件的時候,會執行大量 IO,此時對於 everysec 和 always 的 aof 模式 來講,執行 fsync 會形成阻塞過長時間,no-appendfsync-on-rewrite 字段設置爲默認設置爲 no。 若是對延遲要求很高的應用,這個字段能夠設置爲 yes,不然仍是設置爲 no,這樣對持久化特性來講這是 更安全的選擇。設置爲 yes 表示 rewrite 期間對新寫操做不 fsync,暫時存在內存中,等 rewrite 完成 後再寫入,默認爲 no,建議 yes。Linux 的默認 fsync 策略是 30 秒。可能丟失 30 秒數據。 no-appendfsync-on-rewrite no #aof 自動重寫配置。當目前 aof 文件大小超過上一次重寫的 aof 文件大小的百分之多少進行重寫,即當 aof 文件增加到必定大小的時候 Redis 可以調用 bgrewriteaof 對日誌文件進行重寫。當前 AOF 文件大 小是上第二天志重寫獲得 AOF 文件大小的二倍(設置爲 100)時,自動啓動新的日誌重寫過程。 auto-aof-rewrite-percentage 100 #設置容許重寫的最小 aof 文件大小,避免了達到約定百分比但尺寸仍然很小的狀況還要重寫 auto-aof-rewrite-min-size 64mb #aof 文件可能在尾部是不完整的,當 redis 啓動的時候,aof 文件的數據被載入內存。重啓可能發生在 redis 所在的主機操做系統宕機後,尤爲在 ext4 文件系統沒有加上 data=ordered 選項(redis 宕機 或者異常終止不會形成尾部不完整現象。)出現這種現象,能夠選擇讓 redis 退出,或者導入儘量多的 數據。若是選擇的是 yes,當截斷的 aof 文件被導入的時候,會自動發佈一個 log 給客戶端而後 load。 若是是 no,用戶必須手動 redis-check-aof 修復 AOF 文件才能夠。 aof-load-truncated yes ################################ LUA SCRIPTING ############################### # 若是達到最大時間限制(毫秒),redis 會記個 log,而後返回 error。當一個腳本超過了最大時限。 只有 SCRIPT KILL 和 SHUTDOWN NOSAVE 能夠用。第一個能夠殺沒有調 write 命令的東西。要是已經 調用了 write,只能用第二個命令殺。 lua-time-limit 5000 ################################ REDIS CLUSTER ############################### #集羣開關,默認是不開啓集羣模式。 # cluster-enabled yes #集羣配置文件的名稱,每一個節點都有一個集羣相關的配置文件,持久化保存集羣的信息。這個文件並不需 要手動配置,這個配置文件有 Redis 生成並更新,每一個 Redis 集羣節點須要一個單獨的配置文件,請確 保與實例運行的系統中配置文件名稱不衝突 # cluster-config-file nodes-6379.conf #節點互連超時的閥值。集羣節點超時毫秒數 # cluster-node-timeout 15000 #在進行故障轉移的時候,所有 slave 都會請求申請爲 master,可是有些 slave 可能與 master 斷開連 接一段時間了,致使數據過於陳舊,這樣的 slave 不該該被提高爲 master。該參數就是用來判斷 slave 節點與 master 斷線的時間是否過長。判斷方法是: #比較 slave 斷開鏈接的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period #若是節點超時時間爲三十秒, 而且 slave-validity-factor 爲 10,假設默認的 repl-ping-slave-period 是 10 秒,即若是超過 310 秒 slave 將不會嘗試進行故障轉移 # cluster-slave-validity-factor 10 #master 的 slave 數量大於該值,slave 才能遷移到其餘孤立 master 上,如這個參數若被設爲 2,那 麼只有當一個主節點擁有 2 個可工做的從節點時,它的一個從節點會嘗試遷移。 # cluster-migration-barrier 1 #默認狀況下,集羣所有的 slot 有節點負責,集羣狀態才爲 ok,才能提供服務。設置爲 no,能夠在 slot 沒有所有分配的時候提供服務。不建議打開該配置,這樣會形成分區的時候,小分區的 master 一直在接 受寫請求,而形成很長時間數據不一致。 # cluster-require-full-coverage yes ################################## SLOW LOG ################################### ###slog log 是用來記錄 redis 運行中執行比較慢的命令耗時。當命令的執行超過了指定時間,就記錄 在 slow log 中,slog log 保存在內存中,因此沒有 IO 操做。 #執行時間比 slowlog-log-slower-than 大的請求記錄到 slowlog 裏面,單位是微秒,因此 1000000 就是 1 秒。注意,負數時間會禁用慢查詢日誌,而 0 則會強制記錄全部命令。 slowlog-log-slower-than 10000 #慢查詢日誌長度。當一個新的命令被寫進日誌的時候,最老的那個記錄會被刪掉。這個長度沒有限制。只 要有足夠的內存就行。你能夠經過 SLOWLOG RESET 來釋放內存。 slowlog-max-len 128 ################################ LATENCY MONITOR ############################## #延遲監控功能是用來監控 redis 中執行比較緩慢的一些操做,用 LATENCY 打印 redis 實例在跑命令時 的耗時圖表。只記錄大於等於下邊設置的值的操做。0 的話,就是關閉監視。默認延遲監控功能是關閉的, 若是你須要打開,也能夠經過 CONFIG SET 命令動態設置。 latency-monitor-threshold 0 ############################# EVENT NOTIFICATION ############################## #鍵空間通知使得客戶端能夠經過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 數據集的事件。 由於開啓鍵空間通知功能須要消耗一些 CPU ,因此在默認配置下,該功能處於關閉狀態。 #notify-keyspace-events 的參數能夠是如下字符的任意組合,它指定了服務器該發送哪些類型的通 知: ##K 鍵空間通知,全部通知以 __keyspace@__ 爲前綴 ##E 鍵事件通知,全部通知以 __keyevent@__ 爲前綴 ##g DEL 、 EXPIRE 、 RENAME 等類型無關的通用命令的通知 ##$ 字符串命令的通知 ##l 列表命令的通知 ##s 集合命令的通知 ##h 哈希命令的通知 ##z 有序集合命令的通知 ##x 過時事件:每當有過時鍵被刪除時發送 ##e 驅逐(evict)事件:每當有鍵由於 maxmemory 政策而被刪除時發送 ##A 參數 g$lshzxe 的別名 #輸入的參數中至少要有一個 K 或者 E,不然的話,無論其他的參數是什麼,都不會有任何 通知被分發。 詳細使用能夠參考 http://redis.io/topics/notifications notify-keyspace-events "" ############################### ADVANCED CONFIG ############################### #數據量小於等於 hash-max-ziplist-entries 的用 ziplist,大於 hash-max-ziplist-entries 用 hash hash-max-ziplist-entries 512#value 大小小於等於 hash-max-ziplist-value 的用 ziplist,大於 hash-max-ziplist-value 用 hash。 hash-max-ziplist-value 64 #數據量小於等於 list-max-ziplist-entries 用 ziplist,大於 list-max-ziplist-entries 用 list。 list-max-ziplist-entries 512#value 大小小於等於 list-max-ziplist-value 的用 ziplist,大於 list-max-ziplist-value 用 list。 list-max-ziplist-value 64 #數據量小於等於 set-max-intset-entries 用 iniset,大於 set-max-intset-entries 用 set。 set-max-intset-entries 512 #數據量小於等於 zset-max-ziplist-entries 用 ziplist,大於 zset-max-ziplist-entries 用 zset。 zset-max-ziplist-entries 128#value 大小小於等於 zset-max-ziplist-value 用 ziplist, 大於 zset-max-ziplist-value 用 zset。 zset-max-ziplist-value 64 #value 大小小於等於 hll-sparse-max-bytes 使用稀疏數據結構(sparse),大於 hll-sparse-max-bytes 使用稠密的數據結構(dense)。一個比 16000 大的 value 是幾乎沒用的, 建議的 value 大概爲 3000。若是對 CPU 要求不高,對空間要求較高的,建議設置到 10000 左右。 hll-sparse-max-bytes 3000 #Redis 將在每 100 毫秒時使用 1 毫秒的 CPU 時間來對 redis 的 hash 表進行從新 hash,能夠下降內存 的使用。當你的使用場景中,有很是嚴格的實時性須要,不可以接受 Redis 時不時的對請求有 2 毫秒的延 遲的話,把這項配置爲 no。若是沒有這麼嚴格的實時性要求,能夠設置爲 yes,以便可以儘量快的釋放 內存。activerehashing yes ##對客戶端輸出緩衝進行限制能夠強迫那些不從服務器讀取數據的客戶端斷開鏈接,用來強制關閉傳輸緩 慢的客戶端。 #對於 normal client,第一個 0 表示取消 hard limit,第二個 0 和第三個 0 表示取消 soft limit, normal client 默認取消限制,由於若是沒有尋問,他們是不會接收數據的。 client-output-buffer-limit normal 0 0 0#對於 slave client 和 MONITER client,若是 client-output-buffer 一旦超過 256mb,又或者超過 64mb 持續 60 秒,那麼服務器就會當即斷開客 戶端鏈接。 client-output-buffer-limit slave 256mb 64mb 60#對於 pubsub client,若是 client-output-buffer 一旦超過 32mb,又或者超過 8mb 持續 60 秒,那麼服務器就會當即斷開客戶 端鏈接。 client-output-buffer-limit pubsub 32mb 8mb 60 #redis 執行任務的頻率爲 1s 除以 hz。 hz 10 #在 aof 重寫的時候,若是打開了 aof-rewrite-incremental-fsync 開關,系統會每 32MB 執行一 次 fsync。這對於把文件寫入磁盤是有幫助的,能夠避免過大的延遲峯值。 aof-rewrite-incremental-fsync yes
Redis 的數據持久化
RDB 方式
對內存中數據庫狀態進行快照
RDB 方式:將 Redis 在內存中的數據庫狀態保存到磁盤裏面,RDB 文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成 RDB 文件時的數據庫狀態(默認下,持久化到dump.rdb 文件,而且在 redis 重啓後,自動讀取其中文件,據悉,一般狀況下一千萬的字符串類型鍵,1GB 的快照文件,同步到內存中的 時間是 20-30 秒)
RDB 的生成方式:
1)執行命令手動生成
有兩個 Redis 命令能夠用於生成 RDB 文件,一個是 SAVE,另外一個是 BGSAVE SAVE命令會阻塞 Redis 服務器進程,直到 RDB 文件建立完畢爲止,在服務器進程阻塞期間,服務器不能處理任何命令請求,BGSAVE 命令會派生出一個子進程,而後由子進程負責建立RDB 文件,服務器進程(父進程)繼續處理命令請求,建立 RDB 文件結束以前,客戶端發送的 BGSAVE 和 SAVE 命令會被服務器拒絕
2)經過配置自動生成
能夠設置服務器配置的 save 選項,讓服務器每隔一段時間自動執行一次 BGSAVE 命令,能夠經過 save 選項設置多個保存條件,但只要其中任意一個條件被知足,服務器就會執行 BGSAVE 命令
例如:
save 900 1
save 300 10
save 60 10000
那麼只要知足如下三個條件中的任意一個,BGSAVE 命令就會被執行
服務器在 900 秒以內,對數據庫進行了至少 1 次修改
服務器在 300 秒以內,對數據庫進行了至少 10 次修改
服務器在 60 秒以內,對數據庫進行了至少 10000 次修改
AOF 方式
AOF 持久化方式在 redis 中默認是關閉的,須要修改配置文件開啓該方式。
AOF:把每條命令都寫入文件,相似 mysql 的 binlog 日誌
AOF 方式:是經過保存 Redis 服務器所執行的寫命令來記錄數據庫狀態的文件。
AOF 文件刷新的方式,有三種:
appendfsync always - 每提交一個修改命令都調用 fsync 刷新到 AOF 文件,很是很是慢,但也很是安全
appendfsync everysec - 每秒鐘都調用 fsync 刷新到 AOF 文件,很快,但可能會丟失一秒之內的數據
appendfsync no - 依靠 OS 進行刷新,redis 不主動刷新 AOF,這樣最快,但安全性就差默認並推薦每秒刷新,這樣在速度和安全上都作到了兼顧AOF 數據恢復方式,服務器在啓動時,經過載入和執行 AOF 文件中保存的命令來還原服務器關閉以前的數據庫狀態,具體過程:
載入 AOF 文件
建立模擬客戶端
從 AOF 文件中讀取一條命令
使用模擬客戶端執行命令
循環讀取並執行命令,直到所有完成
若是同時啓用了 RDB 和 AOF 方式,AOF 優先,啓動時只加載 AOF 文件恢復數據
安裝 Redis 集羣
Redis 集羣介紹
Redis3.0 版本以後支持 Cluster。集羣要求集羣節點中必需要支持主備模式,也就說集中的主節點(Master)至少要有一個從節點(Slave)每個藍色的圈都表明着一個 redis 集羣中的主節點。它們任何兩個節點之間都是相互連通的。客戶端能夠與任何一個節點相鏈接,而後就能夠訪問集羣中的任何一個節點。對其進行存取和其餘操做
Redis-Cluster 選舉:容錯
Redis 之間經過互相的 ping-pong 判斷是否節點能夠鏈接上。若是有一半以上的節點去ping 一個節點的時候沒有迴應,集羣就認爲這個節點宕機了,而後去鏈接它的從節點。若是某個節點和全部從節點所有掛掉,咱們集羣就進入 fail 狀態。還有就是若是有一半以上的主節點宕機,那麼咱們集羣一樣進入 fail 了狀態。這就是咱們的 redis 的投票機制,具體原理以下圖所示:
投票過程是集羣中全部 master 參與,若是半數以上 master 節點與 master 節點通訊超時(cluster-node-timeout),認爲當前 master 節點掛掉.
何時整個集羣不可用(cluster_state:fail)?
1) 若是集羣任意 master 掛掉,且當前 master 沒有 slave。此時集羣進入 fail 狀態,也能夠理解成集羣的 slot 映射[0-16383]不完整時進入 fail 狀態。
2) 若是集羣超過半數以上 master 掛掉,不管是否有 slave,集羣進入 fail 狀態.
Redis-Cluster 數據存儲
當咱們的存取的 key 到達的時候,redis 會根據 crc16 的算法得出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,經過這個值,去找到對應的插槽所對應的節點,而後直接自動跳轉到這個對應的節點上進行存取操做。
在 Node1 執行 set name kevin
- 使用 CRC16 算法對 key 進行計算,獲得一個數字,而後對數字進行取餘。
CRC16 : name = 26384
26384%16384 = 10000 - 查找到包含 10000 插槽的節點,好比是 node2,自動跳轉到 node2
- 在 node2 上執行 set name kevin 命令完成數據的插入
- 若是在 node1 上執行 get name,先使用 CRC16 算法對 key 進行計算,在使用16384 取餘,獲得插槽的下標,而後跳到擁有該插槽的 node2 中執行 get name 命令,並返回結果。
安裝集羣
需求:
搭建一個 Redis 的最小集羣,使用僞集羣方式。Redis 中最小的集羣三對主從。在 192.168.70.145 中安裝 6 個 redis 實例。
若是使用已經使用過的單機版建立集羣時,須要刪除 dump.rdb 與 apeendonly.aof 文件。
6 個 redis 實例的端口分配:800一、800二、800三、800四、800五、8006
集羣步驟:
redis 集羣時須要使用一個 ruby 的腳原本完成集羣。
第一步 安裝 ruby 環境
命令: yum install ruby
第二步 安裝 ruby 的包管理器
命令:yum install rubygems
第三步 進入到 redis 的安裝目錄下的 src 目錄下找到到 redis-trib.rb 這個文件 這是集羣時須要的腳本
第四步 這個腳本的執行須要依賴於一些其餘的 ruby 包 因此咱們還要下載一個
redis-3.0.0.gem
將這個文件上傳到 linux 服務器中
第五步 安裝這個 ruby 包
命令:gem install redis-3.0.0.gem
第六步 先啓動 redis 的 6 個實例
先在 local 目錄下建立一個目錄名稱爲:redis-cluster
命令:mkdir redis-cluster
第七步 將安裝好的 redis 下的 bin 目錄拷貝到 redis-cluster 目錄下 並起名爲 redis01
命令:進入到 redis 目錄下執行:cp -r bin …/redis-cluster/redis01
第九步 修改 redis.conf 配置文件
命令:vim redis.conf
(1)修改端口:默認的爲 6379 將六個 redis 實例的端口改爲從 7001-7006 在配置文件的 port 屬性中。
(2)修改開啓集羣 在配置文件中搜索 cluster 找到後 將默認爲註釋的 cluster-enabled yes 去掉註釋
第十步 將這個 redis01 拷貝 6 份到當前這個目錄下
命令:
cp -r redis01/ redis02
cp -r redis01/ redis03
cp -r redis01/ redis04
cp -r redis01/ redis05
cp -r redis01/ redis06
第十一步 修改拷貝的這些 redis 的端口
命令:
[root@localhost redis-cluster]# vim redis02/redis.conf
[root@localhost redis-cluster]# vim redis03/redis.conf
[root@localhost redis-cluster]# vim redis04/redis.conf
[root@localhost redis-cluster]# vim redis05/redis.conf
[root@localhost redis-cluster]# vim redis06/redis.conf
第十二步 把建立集羣的 ruby 腳本複製到 redis-cluster 中
命令:*cp .rb /usr/local/redis-cluster
第十二步 建立一個可以批量啓動的腳本程序
命令:vim startall.sh
第十三步 在腳本文件中添加命令
命令:
cd redis01
./redis.server redis.conf
cd …
cd redis02
./redis.server redis.conf
cd …
cd redis03
./redis.server redis.conf
cd …
cd redis04
./redis.server redis.conf
cd …
cd redis05
./redis.server redis.conf
cd …
cd redis06
./redis.server redis.conf
cd …
第十四步 將批量啓動腳本設置爲可執行權限
命令:chmod +x startall.sh
第十五步 執行這個批量啓動的腳本
命令: ./startall.sh
第十六步 查看 redis 是否啓動成功
命令:ps aux|grep redis
第十七步 建立集羣
命令: ./redis-trib.rb create --replicas 1 192.168.70.145:8001 192.168.70.145:8002
192.168.70.145:8003 192.168.70.145:8004 192.168.70.145:8005 192.168.70.145:8006
控制檯會顯示以下信息 輸入 yes
Creating cluster
Connecting to node 192.168.10.128:7001: OK
Connecting to node 192.168.10.128:7002: OK
Connecting to node 192.168.10.128:7003: OK
Connecting to node 192.168.10.128:7004: OK
Connecting to node 192.168.10.128:7005: OK
Connecting to node 192.168.10.128:7006: OKPerforming hash slots allocation on 6 nodes…
Using 3 masters:
192.168.10.128:7001
192.168.10.128:7002
192.168.10.128:7003
Adding replica 192.168.10.128:7004 to 192.168.10.128:7001
Adding replica 192.168.10.128:7005 to 192.168.10.128:7002
Adding replica 192.168.10.128:7006 to 192.168.10.128:7003
M: 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7 192.168.10.128:7001
slots:0-5460 (5461 slots) master
M: e8038d0965377ff0793911a10984174b57ddbaaf 192.168.10.128:7002
slots:5461-10922 (5462 slots) master
M: be58583284fd2f26f03f2fce6c4e38de240eb841 192.168.10.128:7003
slots:10923-16383 (5461 slots) master
S: e66b85a7e72913f1ca4657600a0113d2cb0ece8e 192.168.10.128:7004
replicates 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7
S: 9f1897cb9c570487685c467b7b4b53f4c0c9f556 192.168.10.128:7005
replicates e8038d0965377ff0793911a10984174b57ddbaaf
S: 1966b2674ce141da372438a29e9e84bfad266da3 192.168.10.128:7006
replicates be58583284fd2f26f03f2fce6c4e38de240eb841
Can I set the above configuration? (type ‘yes’ to accept):
若是控制檯輸出以下信息表集羣成功Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join…Performing Cluster Check (using node 192.168.10.128:7001)
M: 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7 192.168.10.128:7001
slots:0-5460 (5461 slots) master
M: e8038d0965377ff0793911a10984174b57ddbaaf 192.168.10.128:7002
slots:5461-10922 (5462 slots) master
M: be58583284fd2f26f03f2fce6c4e38de240eb841 192.168.10.128:7003
slots:10923-16383 (5461 slots) master
M: e66b85a7e72913f1ca4657600a0113d2cb0ece8e 192.168.10.128:7004
slots: (0 slots) master
replicates 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7
M: 9f1897cb9c570487685c467b7b4b53f4c0c9f556 192.168.10.128:7005
slots: (0 slots) master
replicates e8038d0965377ff0793911a10984174b57ddbaaf
M: 1966b2674ce141da372438a29e9e84bfad266da3 192.168.10.128:7006
slots: (0 slots) master
replicates be58583284fd2f26f03f2fce6c4e38de240eb841
[OK] All nodes agree about slots configuration.Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
測試 Redis 集羣
測試 Redis 集羣:能夠鏈接集羣中的任意一個節點進行測試 注意必定要有-c 參數,不然能連上,可是沒法操做 redis 集羣
命令 ./redis01/redis-cli -h 192.168.10.128 -p 7001 -c
關閉 Redis 集羣
命令:bin/redis-cli -p 7001 shutdown
也能夠編寫一個批量關閉的腳本
命令:
vim shutdown.sh redis01/redis-cli -p 7001 shutdown redis01/redis-cli -p 7002 shutdown redis01/redis-cli -p 7003 shutdown redis01/redis-cli -p 7004 shutdown redis01/redis-cli -p 7005 shutdown redis01/redis-cli -p 7006 shutdown