Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件
redis是c語言編寫的,支持數據持久化,是key-value類型數據庫。
應用在緩存,隊列系統中
redis支持數據備份,也就是master-slave模式
redis一秒可以執行10萬個命令
redis為什么這么快?
1.是完全基於內存數據庫
2.redis是完全用c寫的單線程的數據庫
redis如何安裝
1.yum安裝
安裝:yum install redis -y
卸載:yum remove redis -y
啟動:systemctl start redis
查看監聽端口:netstat -tunlp
2.redis編譯安裝(注意刪除安裝的redis)
編譯安裝三部曲
1.下載redis源碼
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2.解壓縮tar -zxvf redis-4.0.10.tar.gz
3.切換redis源碼目錄cd redis-4.0.10
4.編譯源文件make
5.編譯好后,src/目錄下有編譯好的redis指令
6.make install 安裝到指定目錄,默認在/usr/local/bin
添加環境變量:vim /etc/profile
path= “/usr/local/bin”
重新加載變量文件:source /etc/profile
grep -v "^$" redis.conf |grep -v "^#" 去注釋#
4.更改redis的配置文件,啟動redis,支持密碼和端口
touch redis.s18.conf 內容如下:
bind 192.168.91.128 # 連接ip protected-mode yes # 開啟redis安全模式 port 6800 # 端口 daemonize yes #redis后台啟動 pidfile /var/run/redis_6379.pid loglevel notice logfile "" requirepass 123456 #密碼
啟動:redis-server redis.s18.conf
檢測端口:netstat -tunlp
5.登陸redis客戶端
redis-cli -h 192.168.91.128 -p 6800
參數解釋 -h指定主機地址 -p指定redis端口
登陸之后通過auth指令 驗證密碼
redis可執行文件
./redis-benchmark //用於進行redis性能測試的工具
./redis-check-dump //用於修復出問題的dump.rdb文件
./redis-cli //redis的客戶端
./redis-server //redis的服務端
./redis-check-aof //用於修復出問題的AOF文件
./redis-sentinel //用於集群管理
redis數據類型
redis是一種高級的key:value存儲系統,其中value支持五種數據類型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
redis存放的數據是key,然后通過value來取值
keys * 查看所有key
type key 查看key類型
expire key seconds 設置過期時間
ttl key 查看key過期剩余時間 -2表示key已經不存在了
persist key 取消key的過期時間 -1表示key存在,沒有過期時間
exists key 判斷key存在 存在返回1 否則0
del keys 刪除key 可以刪除多個
dbsize 計算key的數量
set key名 value名
set kevins 凱文
ger kevins 取值
1.strings類型
-
set 設置key
-
get 獲取key
-
append key 追加string
-
mset 設置多個鍵值對
-
mget 獲取多個鍵值對
-
del 刪除key
-
incr key 遞增+1
-
decr key 遞減-1
redis發布訂閱
發布訂閱的命令
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持久化RDB與AOF**
1.當進程掛掉,只要內存數據被釋放,redis的 數據默認是會丟
2.redis支持數據持久化,兩種模式
rdb持久化,是基於內存數據快照的方式,通過save指令,強制快照到數據本地,存儲為一個二進制文件
3.開啟rdb功能,需要修改redis.conf文件
內容如下:
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
bind 127.0.0.1
save 900 1
save 300 10
save 30 10000
4.開啟redis服務端,支持rdb功能
redis-server redis-rdb.conf
5.登陸redis,寫入數據,手動執行save觸發持久化,會生成一個二進制的數據文件 dbmp.rdb,在/data/6379/redis.log目錄下
redis持久化之RDB實踐
1.將修改類的redis命令,記錄到一個日志中,以保證數據不丟,下次重啟,再執行這個文件,數據就回來
2.開啟rdb模式,修改redis-aof.conf配置如下:
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
appendonly yes
appendfsync everysec
3.指定aof配置文件啟動
redis-server redis-aof.conf
redis 持久化方式有哪些?有什么區別?
rdb:基於快照的持久化,速度更快,一般用作備份,主從復制也是依賴於rdb持久化功能
aof:以追加的方式記錄redis操作日志的文件。可以最大程度的保證redis數據安全,類似於mysql的binlog
redis在不重啟的狀態下,切換rdb持久化到aof持久化
1.准備一個支持rdb數據
配置文件redis-new-rdb.conf如下:
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
bind 127.0.0.1
save 900 1
save 300 10
save 30 10000庫
2.通過命令切換到aof功能,臨時生效
CONFIG set appendonly yes #開啟AOF功能
CONFIG SET save "" #關閉RDB功能
3.還得修改redis的配置文件,讓他下次重啟也是aof模式
修改redis-new-rdb.conf 配置如下:
daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 appendonly yes appendfsync everysec
4.redis已經切換到aof模式
redis主從同步
1.redis是支持多實例的數據庫 ,在一台機器上,可以運行多個隔離的數據庫環境
實現多實例就是准備多個配置文件
替換:sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
准備3個配置文件,實現,一主兩從的redis數據架構
准備的3個配置文件,僅僅是端口的區分就行
port 6379 daemonize yes pidfile /data/6379/redis.pid loglevel notice logfile "/data/6379/redis.log" dbfilename dump.rdb dir /data/6379 protected-mode no
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
slaveof 127.0.0.1 6379
port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no
slaveof 127.0.0.1 6379
追加命令:echo "slaveof 127.0.0.1 6379" >> redis-6381.conf
三個同樣的文件
建立文件夾:mkdir -p /data/{6379,6380,6381}
分別啟動三個redis數據庫實例
redis-server redis-6379.conf
redis-server redis-6380.conf redis-server redis-6381.conf
查看三個數據庫的身份信息,檢測主從狀態
進入:redis-cli -p 6379
輸入:info
查看Replication結果:
role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=1 master_replid:8ebe1c8b3f2211e1be132332d7548d059cffc954 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:280 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:280
測試寫入主庫 6379數據,查看兩個從庫的信息,確認6380,6381
演示干掉主庫,手動切換主從故障
1.手動檢查進程,殺死主庫,演示故障
2.手動切換某一個從庫,換成主庫身份
就是redis-cli -p 6380 登陸6380后,輸入 slaveof on one,去掉自己的slave身份
3.將6381重新指引到6380位從庫,
redis-cli -p 6381登陸6381后,輸入slaveof 127.0.0.1 6380
4.手動改配置文件
自動的redis主從切換,是哨兵功能
/opt/s18redis目錄下
1.環境配置 准備3個redis數據庫實例
准備3個配置文件
redis-6379.conf
port 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/var/redis/data/"
redis-6380.conf
port 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/var/redis/data/" slaveof 127.0.0.1 6379 // 從屬主節點
redis-6381.conf
port 6381 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/var/redis/data/" slaveof 127.0.0.1 6379 // 從屬主節點
建立文件夾:mkdir -p /data/{6379,6380,6381}
檢測身份信息:redis-cli -p 6370 進入后輸入:info
此時再准備三個哨兵,就是三個值班的,檢測redis主從狀態
三個哨兵配置文件如下:
redis-26379.conf
port 26379 dir /var/redis/data/ logfile "26379.log" // 當前Sentinel節點監控 127.0.0.1 6379 這個主節點 // 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意 // s18ms是主節點的別名 sentinel monitor s18ms 127.0.0.1 6379 2 //每個Sentinel節點都要定期PING命令來判斷Redis數據節點和其余Sentinel節點是否可達,如果超過30000毫秒30s且沒有回復,則判定不可達 sentinel down-after-milliseconds s18ms 30000 //當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數為1 sentinel parallel-syncs s18ms 1 //故障轉移超時時間為180000毫秒 sentinel failover-timeout s18ms 180000 daemonize yes
redis-26380.conf
port 26380 dir /var/redis/data/ logfile "26380.log"
sentinel monitor s18ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s18ms 30000
sentinel parallel-syncs s18ms 1 sentinel failover-timeout s18ms 180000 daemonize yes
redis-26381.conf
port 26381 dir /var/redis/data/ logfile "26381.log"
sentinel monitor s18ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s18ms 30000
sentinel parallel-syncs s18ms 1 sentinel failover-timeout s18ms 180000 daemonize yes
分別啟動三個哨兵
536 redis-sentinel redis-26379.conf 537 redis-sentinel redis-26380.conf 538 redis-sentinel redis-26381.conf
查看哨兵信息:
redis-cli -p 26379
輸入:info sentinel
此時哨兵已經正確,三個哨兵,檢測者一主兩從:
sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=s18ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
自動主從故障切換演練
1.干掉3679,查看6380和6381的身份信息
2.正確是 哨兵會選舉6380為新的master,然后為6380為6381新salve
3.當6379重新復活之后,會自動添加到主從架構之中
redis-cluster的集群搭建
1.環境准備,准備6個節點(6批馬兒),指的就是啟動6個redis數據庫實例
6個節點僅僅是端口不同
redis-7000.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 #集群內部的配置文件 cluster-require-full-coverage no #redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那么整個cluster不對外提供服務。 因此生產環境一般為no
五個文件僅僅的是端口不同
redis-7001.conf
port 7001 daemonize yes dir "/opt/redis/data" logfile "7001.log" dbfilename "dump-7001.rdb" cluster-enabled yes cluster-config-file nodes-7001.conf cluster-require-full-coverage no
redis-7002.conf
redis-7003.conf
redis-7004.conf
redis-7005.conf
分別啟動6個redis數據實例
[root@localhost s18cluster]# redis-server redis-7000.conf [root@localhost s18cluster]# redis-server redis-7001.conf [root@localhost s18cluster]# redis-server redis-7002.conf [root@localhost s18cluster]# redis-server redis-7003.conf [root@localhost s18cluster]# redis-server redis-7004.conf [root@localhost s18cluster]# redis-server redis-7005.conf
檢查集群狀態
redis-cli -p 7000
進行redis-cluster集群槽位分配
redis官方提供了ruby語言的腳本,進行自動槽位分配
perl python ruby都是腳本語言
1.安裝准備ruby語言的環境,用於自動化創建redis集群
#下載ruby wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz #安裝ruby tar -xvf ruby-2.3.1.tar.gz ./configure --prefix=/opt/ruby/ make && make install #准備一個ruby命令#准備一個gem軟件包管理命令 #拷貝ruby命令到path下/usr/local/ruby cp /opt/ruby/bin/ruby /usr/local/cp bin/gem /usr/local/bin
2.編譯安裝完成后,添加環境變量
把bin添加環境變量:
[root@localhost bin]# pwd /opt/ruby/bin
vim /etc/profile
source /etc/profile
3.通過ruby的軟件包管理工具安裝redis模塊(gem就是類似python的pip工具)
在opt/s18cluster/目錄下
wget http://rubygems.org/downloads/redis-3.3.0.gem # 通過gem安裝這個redis包 gem install -l redis-3.3.0.gem #查看gem有哪些包 gem list -- check redis gem
4.找到ruby創建redis集群的腳本工具
命令:find /opt -name redis-trib.rb
結果:/opt/redis-4.0.10/src/redis-trib.rb
5.此時就可以通過ruby來創建redis的集群,分配槽點
一鍵開啟redis-cluster集群
#每個主節點,有一個從節點,代表--replicas 1 /opt/redis-4.0.10/src/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
6.集群已經創建成功
redis-cli -p 7000 -c #-c是集群的模式
127.0.0.1:7000> set name kevins -> Redirected to slot [5798] located at 127.0.0.1:7001
