一,常見非關系數(shù)據(jù)庫和sql
關系型數(shù)據(jù)庫 mysql oracle
非關系型數(shù)據(jù)庫mongodb redis
二, redis重要特性
1.速度快耘拇,源碼少,不依賴操作系統(tǒng)中的類庫
redis 所有的數(shù)據(jù)都存放在內存中
redis 使用c語言實現(xiàn)
redis 使用單線程架構
2.基于鍵值對的數(shù)據(jù)結構服務器
物種數(shù)據(jù)結構:
字符串: 設置一個key mset k1 2 k2 3 k4 4 MSET,MGET
哈希:由鍵值對組成 HMSET指令設置hash中的多個域
**生成一個hash類型:**
HMSET user:1 name xiaozhang job it age 28
HMSET user:2 name abc job it age 28
HMSET user:3 name def job it age 28
**查看hash里的多個值**
HMGET user:1 name age job
**查看hash里的所有的值**
HGETALL user:1
**mysql數(shù)據(jù)和redis哈希對比:**
user表
uid name job age
1 xiaozhang it 28
2 xiaoya it 28
3 yazhang it 28
**redis緩存mysql數(shù)據(jù)**
名字 key1 k1值 key2 k2的值 key3 k3的值
uid:1 name xiaozahng job it age 28
uid:2 name xiaoya job it age 28
uid:3 name yazahng job it age 28
列表
集合
有序集合
3.豐富的功能
提供鍵過期功能缺狠,可以實現(xiàn)緩存。使用單線程模型萍摊,服務端處理模型簡單挤茄。客戶端語言多冰木,java,PHP,python,C, Nodejs等
4. redis支持數(shù)據(jù)的持久化
實現(xiàn)把所有數(shù)據(jù)存放在內存中RDB和AOF
5. redis的主從復制和高可用
哨兵 redis-sentinel
集群 redis-cluster
三 redis的應用場景
1. 緩存過期時間穷劈,就是設置k值過期 expire k1 100 設置100秒過期
persist k1 取消過期時間
緩存session會話
緩存用戶信息,找不到再去mysql查,查到然后回寫到redis
優(yōu)惠卷過期時間
2. 排行榜-列表&有序集合
熱度排行榜
發(fā)布時間排行榜
3. 計數(shù)器天然支持計數(shù)器 INCR K1(加1)INCRBY K1 10(加10)
如 帖子瀏覽數(shù)
視頻播放次數(shù)
商品瀏覽數(shù)
4. 社交網(wǎng)絡-集合
5. 消息列隊系統(tǒng)-發(fā)布訂閱
配合ELK實現(xiàn)日志收集
四 redis持久化
總所周知redis是內存數(shù)據(jù)庫,當redis所在服務器宕機所以數(shù)據(jù)就會丟失踊沸,為解決這個問題 redis 用rdb 和aof來解決
牛逼持久化鏈接 https://www.shuzhiduo.com/A/amd0oNam5g/
用RDB和AOF實現(xiàn)
RDB:實現(xiàn)快照功能歇终,把當前內存里的狀態(tài)快照到磁盤上
優(yōu)點,恢復速度快
缺點:可能會丟失數(shù)據(jù)
AOF:類似與mysql的binlog逼龟,重寫 一秒一次
優(yōu)點评凝,安全,有可能丟失一秒的數(shù)據(jù)
缺點腺律,文件比較大奕短,恢復速度慢
當插入一個新K時會1秒后先觸發(fā)aof文件記錄內容,故當rdb和aof文件同時存在時 優(yōu)先讀取aof文件匀钧。
RDB的配置文件配置持久化參數(shù)
save 900 1
save 300 10
save 60 10000 60秒發(fā)生一萬次K的該變就會觸發(fā)將數(shù)據(jù)寫入到磁盤
dir /data/redis_6379/
dbfilename redis_6379.rdb
結論:
1.執(zhí)行shutdown的時候,內部會自動執(zhí)行bgsave,然后再執(zhí)行 shutdown
2.pkill kill killall 都類似于執(zhí)行shutdown命令.會觸發(fā)bgsave持久化
3.恢復的時候,rdb文件名稱要和配置文件里寫的一樣
4.如果沒有配置save參數(shù),執(zhí)行shutdown不會自動bgsave持久化
5.如果沒有配置save參數(shù),可以手動執(zhí)行bgsave觸發(fā)持久化保存
五翎碑,redis的高可用原理
建立主從,在redis服務器上設置哨兵監(jiān)控主從狀態(tài)實時進 行故障轉移之斯。當主故障庫修復后日杈,如果想恢復主庫的地位,需要手動設置權重為0佑刷,然后重建手動改變
10.模擬權重選舉
- 設置其他節(jié)點的權重為0
- 手動發(fā)起重新選舉
- 觀察所有節(jié)點消息是否同步
- 觀察切換結果是否符合預期
命令解釋:
1.查詢命令:CONFIG GET slave-priority
2.設置命令:CONFIG SET slave-priority 0
3.主動切換:sentinel failover mymaster
操作命令:
redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0
redis-cli -h db01 -p 26379 sentinel failover mymaster
驗證選舉結果:
redis-cli -h db01 -p 26379 Sentinel get-master-addr-by-name mymaster
恢復DB01主哨兵后 恢復正常的優(yōu)先級
redis-cli -h db02 -p 6379 CONFIG SET slave-priority 100
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 100
五莉擒,redis的主從復制高可用
redis的主從復制,時在分布式系統(tǒng)中解決單點問題项乒,通常會將數(shù)據(jù)復制多個副本到其他機器上啰劲,滿足故障恢復和負載均衡。同時復制功能也是運行高可用的基礎檀何。
六蝇裤,主從復制哨兵
運行在redis的主從復制模式下,解 決主節(jié)點一旦發(fā)生故障不需要人工干 預的問題频鉴,redis的哨兵方案實現(xiàn)的高 可用對系統(tǒng)可用性非常由幫助栓辜。
redis sentinel時一個分布式系統(tǒng),為redis提供高可用功能垛孔,主要功能是1. 監(jiān)控redis服務器節(jié)點看主從之間是否運行正常
2.提醒運維運維人員發(fā)送故障通知
3.自動故障遷移failover藕甩,當主服務 器故障時 哨兵會開始一次故障遷移操作,選擇該主從中的一個從節(jié)點作為新主周荐,并讓其他的從服務器重新復制新主的數(shù)據(jù)狭莱。并且當客戶端連接原先的主服務器時僵娃,集群也會像客戶端返回新主的地址。架構圖如下
哨兵安裝配置命令
哨兵是基于主從復制腋妙,所以需要先部署好主從復制
手工操作步驟如下: 1.先配置和創(chuàng) 建好 1 臺服務器的節(jié)點和哨兵 2.使用 rsync 傳輸?shù)搅硗?2 臺機器 3.修改另外兩臺機器的 IP 地址 建議使用 ansible 劇本批量部署
配置主從關系
db02 和 db03
redis-server /opt/redis_6379/conf/redis_6379.conf
redis-cli slaveof 10.0.0.51 6379
ps -ef|grep redis
啟動哨兵
3 臺都操作
redis-sentinel /opt/redis_26379/conf/redis_26379.conf
,手動恢復主庫默怨,既模擬故障恢復
1.主發(fā)生故障后,骤素,觀察其他從庫的日志變化匙睹,故障轉移后哨兵配置文件的變化。
2. 修好主庫后開啟主庫济竹,在從庫中設置優(yōu)先級為0:.查詢命令:CONFIG GET slave-priority
3.設置命令:CONFIG SET slave-priority 0
4.再在主庫中sentinel failover mymaster.重新設置自己為主
5.改回原先設置的從優(yōu)先級默認的值100痕檬,方便下次故障轉移。
七送浊,redis Cluster
redis cluster 時redis的分布式解決方案梦谜,在3.0版本正式推出
當遇到單機,內存罕袋,并發(fā)改淑,流量等瓶頸時,可用采用cluster架構方案達到負載均衡目的浴讯。
官方的redis Cluster集群方案, 很好的解決了集群方面的問題
分布式redis數(shù)據(jù)庫時將整個數(shù)據(jù)庫按照分區(qū)規(guī)則映射到多個節(jié)點蔼啦,將數(shù)據(jù)集劃分到多個節(jié)點上榆纽,
每個節(jié)點負責整體數(shù)據(jù)的一個子集,采用的是hash分片規(guī)則捏肢。
集群規(guī)劃目錄規(guī)劃
redis 安裝目錄
/opt/redis_{PORT}/{conf,logs,pid}
redis 數(shù)據(jù)目錄
/data/redis_{PORT}/redis_{PORT}.rdb
redis 運維腳本
/root/scripts/redis_shell.sh