發佈訂閱的命令node
PUBLISH channel msg 將信息 message 發送到指定的頻道 channel SUBSCRIBE channel [channel ...] 訂閱頻道,能夠同時訂閱多個頻道 UNSUBSCRIBE [channel ...] 取消訂閱指定的頻道, 若是不指定頻道,則會取消訂閱全部頻道 PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道,每一個模式以 * 做爲匹配符,好比 it* 匹配所 有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配全部 以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類 PUNSUBSCRIBE [pattern [pattern ...]] 退訂指定的規則, 若是沒有參數則會退訂全部規則 PUBSUB subcommand [argument [argument ...]] 查看訂閱與發佈系統狀態 注意:使用發佈訂閱模式實現的消息隊列,當有客戶端訂閱channel後只能收到後續發佈到該頻道的消息,以前發送的不會緩存,必須Provider和Consumer同時在線。
redis是內存型的數據庫mysql
redis
提供了RDB(Redis DataBase)持久化
的功能,這個功能能夠將redis
在內存中的的狀態保存到硬盤中,它能夠手動執行。也能夠再redis.conf
中配置,按期執行。RDB持久化產生的RDB文件是一個通過壓縮的二進制文件,這個文件被保存在硬盤中,redis能夠經過這個文件還原數據庫當時的狀態。web
RDB(持久化) 內存數據保存到磁盤 在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot) 優勢:速度快,適合作備份,主從複製就是基於RDB持久化功能實現 rdb經過再redis中使用save命令觸發 rdb 1.基於內存的數據快照 2.按期執行數據快照 3.手動觸發數據快照 rdb配置參數: dir /data/6379/ dbfilename dbmp.rdb 每過900秒 有1個操做就進行持久化 save 900秒 1個修改類的操做 save 300秒 10個操做 save 60秒 10000個操做 save 900 1 save 300 10 save 60 10000
redis持久化之RDB實踐redis
(1)啓動redis服務端,準備配置文件sql
port 6379 daemonize yes dir /data/6379 # 定義持久化文件存儲位置 pidfile /data/6379/redis.pid # redis進程pid文件 loglevel notice # 日誌級別 logfile "/data/6379/redis.log" # redis日誌log文件 protected-mode yes # 保護模式 dbfilename dbmp.rdb # rdb持久化文件 #bind 10.0.0.10 127.0.0.1 # redis綁定地址 #requirepass redhat # redis登陸密碼 save 900 1 # rdb機制 每900秒 有1個修改記錄 save 300 10 # 每300秒 10個修改記錄 save 60 10000 # 每60秒內 10000修改記錄
(2)啓動redis服務端數據庫
(3)登陸redis設置一個keyvim
redis-cli -a redhat
(4)此時檢查目錄,/data/6379底下沒有dbmp.rdb文件緩存
(5)經過save觸發持久化,將數據寫入RDB文件安全
127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> save OK
注意: 因爲這個dbmp.rdb文件是用來存儲持久化數據的,理所固然若是被刪除了的話,數據就會消失ruby
AOF(append-only log file)
記錄服務器執行的全部變動操做命令(例如set del等),並在服務器啓動時,經過從新執行這些命令來還原數據集
AOF 文件中的命令所有以redis協議的格式保存,新命令追加到文件末尾。
優勢:最大程度保證數據不丟失 (比RDB要好,由於RDB有可能丟失數據)
缺點:日誌記錄很是大
(1)配置參數
AOF持久化配置,兩條參數
appendonly yes
appendfsync always 老是修改類的操做
everysec 每秒作一次持久化
no 依賴於系統自帶的緩存大小機制
(2)準備aof配置文件 redis.conf
daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 dbfilename dbmp.rdb requirepass redhat save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysec
(3)啓動redis服務
redis-server /etc/redis.conf
(4)檢查redis數據目錄/data/6379/是否產生了aof文件
[root@web02 6379]# ls appendonly.aof dbmp.rdb redis.log
(5)登陸redis-cli,寫入數據,實時檢查aof文件信息
[root@web02 6379]# tail -f appendonly.aof
(6)設置新key,檢查aof信息,而後關閉redis,檢查數據是否持久化
redis-cli -a redhat shutdown redis-server /etc/redis.conf redis-cli -a redhat
注:edis 持久化方式有哪些?有什麼區別?
rdb:基於快照的持久化,速度更快,通常用做備份,主從複製也是依賴於rdb持久化功能
aof:以追加的方式記錄redis操做日誌的文件。能夠最大程度的保證redis數據安全,相似於mysql的binlog
原理:
從服務器向主服務器發送 SYNC 命令。
接到 SYNC 命令的主服務器會調用BGSAVE 命令,建立一個 RDB 文件,並使用緩衝區記錄接下來執行的全部寫命令。
當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 文件,而從服務器則會接收並載入這個文件。
主服務器將緩衝區儲存的全部寫命令發送給從服務器執行。
****************************************************************************************
(1)準備三個redis數據庫配置文件
背景: 一主兩從
6380爲主,6381和6382 爲從
cd /opt/redis_conf vim redis-6380.conf 寫入如下配置 port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no
再建立兩個配置文件6381和6382
sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf sed "s/6380/6382/g" redis-6380.conf > redis-6382.conf
建立數據文件目錄
[root@qishi666 redis_conf]# mkdir -p /data/6380 [root@qishi666 redis_conf]# mkdir -p /data/6381 [root@qishi666 redis_conf]# mkdir -p /data/6382
(2)啓動redis數據庫
[root@qishi666 redis_conf]# redis-server redis-6380.conf [root@qishi666 redis_conf]# redis-server redis-6381.conf [root@qishi666 redis_conf]# redis-server redis-6382.conf
(3)確保這三個redis數據庫是徹底獨立的數據庫
(4)給兩個從服務器配置文件再添加一行配置(很重要)
在6381和6382配置文件添加這一行配置,表示指定主服務器爲6380 slaveof 127.0.0.1 6380
(5)重啓數據庫
pkill redis redis-server /opt/redis_conf/redis-6380.conf redis-server /opt/redis_conf/redis-6381.conf redis-server /opt/redis_conf/redis-6382.conf
(6)查看主從數據庫狀態
redis-cli -p 6380 info redis-cli -p 6380 info replication
(7)添加數據進行測試
(8)手動進行主從複製故障切換
1.關閉6381的從庫身份
redis-cli -p 6381 info replication slaveof no one
2.將6382設爲6381的從庫
6382鏈接到6381: [root@db03 ~]# redis-cli -p 6382 127.0.0.1:6382> SLAVEOF no one 127.0.0.1:6382> SLAVEOF 127.0.0.1 6381
sentinel主要功能以下:
不時的監控redis是否良好運行,若是節點不可達就會對節點進行下線標識
若是被標識的是主節點,sentinel就會和其餘的sentinel節點「協商」,若是其餘節點也人爲主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
redis-6380.conf redis-6381.conf redis-6382.conf
redis-server redis-6380.conf redis-server redis-6381.conf redis-server redis-6382.conf redis-cli -p 6380 info replication redis-cli -p 6381 info replication redis-cli -p 6382 info replication
cd /opt/redis_conf vim redis-26380.conf vim redis-26381.conf vim redis-26382.conf
寫入如下配置文件
port 26379 dir /var/redis/data/ logfile "26379.log" sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
daemonize yes
若是發現哨兵沒有正常啓動,必須把IP改成127.0.0.1
若是你是在三個不一樣的機器上,只能用機器對外訪問的IP,那就須要添加這一個配置
sentinel announce-ip 127.0.0.1
[root@qishi666 redis_conf]# redis-sentinel redis-26380.conf [root@qishi666 redis_conf]# redis-sentinel redis-26381.conf [root@qishi666 redis_conf]# redis-sentinel redis-26382.conf
從配置主從同步開始作
大體思路
殺掉主節點的redis進程6379端口,觀察從節點是否會進行新的master選舉,進行切換
從新恢復舊的「master」節點,查看此時的redis身份
首先查看三個redis的進程狀態
全量數據, 量很大,一臺機器沒有辦法所有處理完,因此須要多臺機器同時處理,才能達到咱們想要的效果
就相似於一大車貨物,經過5輛馬車來運輸
redis集羣槽位概念:虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把全部的數據映射到一個固定範圍內的整數集合,整數定義爲槽(slot)。
redis集羣配置
cd /opt/jq vim redis-7000.conf vim redis-7001.conf vim redis-7002.conf vim redis-7003.conf vim redis-7004.conf vim redis-7005.conf
寫入配置
port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes cluster-config-file nodes-7000.conf
這6個節點配置文件都同樣,僅僅是端口的不一樣
[root@qishi666 jq]# sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf [root@qishi666 jq]# sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf [root@qishi666 jq]# sed "s/7000/7003/g" redis-7000.conf > redis-7003.conf [root@qishi666 jq]# sed "s/7000/7004/g" redis-7000.conf > redis-7004.conf [root@qishi666 jq]# sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
cd /opt/jq redis-server redis-7000.conf redis-server redis-7001.conf redis-server redis-7002.conf redis-server redis-7003.conf redis-server redis-7004.conf redis-server redis-7005.conf
報錯,沒有分配哈希槽
分配redis集羣狀態,以及槽位分配,互聯網企業,豆瓣公司開源的一個工具
下載、編譯、安裝Ruby
安裝rubygem redis
安裝redis-trib.rb命令
wget http://rubygems.org/downloads/redis-3.3.0.gem gem install -l redis-3.3.0.gem 安裝redis-trib.rb命令 [root@qishi666 jq]# find /opt -name redis-trib.rb /opt/redis-4.0.10/src/redis-trib.rb [root@qishi666 jq]# cp /opt/redis-4.0.10/src/redis-trib.rb /usr/local/bin/
# 每一個主節點,有一個從節點,表明--replicas 1 redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 # 集羣自動分配主從關係 7000、7001、7002爲主 7003、7004、7005爲從
查看集羣狀態
redis-cli -p 7000 -c