Redis是一款高效能的NOSQL數據庫。
NoSQL最初指不使用SQL標準的數據庫,現在泛指所有的非關係型數據庫。
NoSQL和SQL數據庫是相輔相成,不存在相互替換的可能。
NoSQL數據庫都複合CAP定理。
CAP定理:C(強一致性),A(高可用性),P(高分割區容錯性)只能滿足其二,無法同時滿足!
常見NOSQL數據庫:
①Redis : 常見在java應用中。
特點: Key-value結構儲存
②Mongodb: 常見在前端或Java應用中。
特點: 儲存具有自我描述性的數據。
例如: html,xml,json
文件型數據庫
③HBase: 海量數據(百億級)的實時讀寫場景
特點: 列式儲存
④Neo4J: 圖數據庫。用於圖計算。社羣網站,社交關係等計算。
特點: 支援圖式儲存和圖式計算
特點: ①短小精悍
核心程式碼不超過2w行,總版本程式碼不超過5w行。
效能強勁,每秒百萬級讀寫
②伺服器端是單執行緒,多路IO複用
單執行緒: 伺服器同時只能處理一條命令
多路IO複用:
③使用C語言編寫
④在記憶體中工作的數據庫
凡是C語言編寫的軟體,必須先編譯後安裝。
編譯: ①在Makefile檔案所在的目錄,執行make命令
make: 編譯,在編譯c語言寫的軟體時,需要有 gcc-c++庫
安裝gcc-c++: yum -y install gcc-c++
②cd src ,執行make(編譯) 命令, make install (安裝)
安裝的檔案存放在 /usr/local/bin中
伺服器端:
啓動: redis-server 組態檔
停止: ctrl+c : 強行停止
用戶端 shutdown: 通過用戶端停止
用戶端:
使用: redis-cli 參數 命令
啓動: redis-cli -h 服務的主機名 -p 埠號
redis-cli : 預設連localhost:6379
退出: quit; exit;
數據: key(string)-value[string,hash,list,set,zset(sorted set)]
前端---->{"name":"mike","age":18}---->後臺----->Person p---->Dao(ORM)---->數據庫(Mysql)
數據庫(Redis)--->String---->Person物件序列化---->從redis中get(key)----反序列化---->使用
---->JSON串----->從redis中get(key)---->轉爲Java物件
{"name":"mike","age":18}----->從redis中get(key)---->java物件---->setAge(19)---->JSON----set()
redis提供了hash結構
{field:value,field:value,field:value}
hash{"name":"mike","age":18}--->hset(age:19)
Redis在記憶體中工作,可能需要將記憶體的數據持久化到磁碟,保證數據安全。
Redis提供了RDB,AOF持久化
RDB持久化
RDB: 快照備份。 每間隔一段時間,觸發備份。redis伺服器的主進程使用fork()複製一個和主進程一模一樣
的子進程(共用所有的資源)。 主進程預設會阻塞,等待子進程將數據全部dump到磁碟。
持久化結束後,子進程停止,主進程繼續接受請求!
全盤備份。 每次持久化後,新的快照檔案,覆蓋舊的快照檔案。
缺點: 有可能丟失最後一次持久化後的數據!
工作:
進行備份:
dbfilename : 備份後的檔名,預設dump.rdb
dir : rdb和aof備份檔案的存放目錄
預設./ (redis-server命令在哪個目錄啓動)
恢復數據: 每次redis服務啓動時,讀取dir/dbfilename,將全部數據一次性讀入到記憶體
備份的時機:
主動備份: ①執行save/bgsave命令
②執行shutdown命令
③執行flushall命令,持久化的數據中沒有key-value
自動備份:在redis.conf設定
save <seconds> 且 <changes>
seconds: 舉例上次備份的時間
changes: 寫運算元
其他設定:
AOF備份也叫日誌備份。
AOF需要手動開啓。appendonly yes
AOF檔案人類可讀可寫。可以用來做一些致命操作的恢復,例如flushall。
如果aof檔案損壞,可以使用redis-check-aof --fix 檔案進行自動修復。
如果既有RDB也有AOF,預設採用AOF進行恢復。AOF安全性較高。
備份: 只記錄寫操作到一個日誌檔案中
恢復: 服務啓動時,讀入日誌檔案中所有的寫操作命令,從頭到尾依次執行來重建數據
相關參數: appendfilename : 儲存的日誌檔名稱
dir : 日誌檔案儲存的目錄
如何備份: appendfsync always| everysec(預設) | no
沒間隔1秒,將緩衝區中的寫操作命令持久化到磁碟。
最多丟失1秒的數據。
AOF重寫: 在不影響數據的情況下,重寫aof檔案,消除冗餘的寫命令。
好處: ①節省磁碟空間 ②服務啓動恢復數據時,縮短啓動時間
特點: ①安全,預設最多隻丟失一秒數據
②aof檔案,人類可操作,避免致命失誤flushall
③aof檔案,比rdb臃腫,佔用磁碟空間大
④恢復時,速度慢
Redis中的事務不同於關係型數據庫中的事務!
Redis中的事務,將多條命令,一起組隊,一起提交,防止多條命令按順序執行時,被其他
用戶端發送的命令所打斷。
命令:
multi : 開啓一個事務塊
exec :提交一個事務塊執行
discard : 解散一個事務塊
鎖是爲了解決當多個執行緒同時操作同一資源時,競爭導致的數據錯誤問題!
悲觀鎖: 安全,在多執行緒環境下,效率低!
樂觀鎖: 在多讀的場景,效率高。
在多寫的場景,存在資源浪費。
Redis主要作爲快取數據庫。快取主要是讀的場景,redis採用了樂觀鎖的設計。
加鎖: watch key....
加鎖需要和事務一起使用!
Lua指令碼和事務類似。Lua指令碼將多條命令,寫入到一個指令碼中。
提交執行這個指令碼,就可以按順序執行多條命令。
Lua指令碼和事務不同的地方在於命令的原子性。
在事務中,每條命令是一個原子。
在Lua指令碼中,整個指令碼是一個原子(命令)
Lua指令碼支援呼叫C/C++程式碼,也支援被C/C++程式碼呼叫。
適用於以下場景:
①避免單點故障
②提高併發讀的能力
角色: master : 主機
slave : 從機
設定: slaveof 主機ip 主機port
slaveof no one ;解除主從關係
原則: 配從不配主
數據同步原理: 當從機執行slaveof時,向目標主機發送sync命令,請求同步主機所有的數據。
主機收到命令後,執行一次rdb備份,將備份後的快照檔案發送給從機。
從機讀取快照檔案,擁有和主機一樣的數據。
sync命令之後,主機新增的數據,主機會將寫操作命令同步發送給從機,從機執行命令
保證數據一致。
細節: ①設定主從後,從機複製主機所有的數據
②主機宕機,從機依然在原地待命
③從機宕機,從機重新啓動後,依然可以擁有宕機期間主機新增的記錄
④如果主機向多個從機同步數據壓力過大,可以通過主--從(主)----從模式解決
哨兵也是一個服務。哨兵服務主要用來監控主機從機的狀態,當主機宕機時,自動主從切換。
狀態標識: sdown : 主觀下線,當前哨兵認爲監控的機器已經下線
odown : 客觀下線,所有哨兵在投票後,一旦sdown滿足投票數,就認爲當前機器已經odown
在主機標識爲odown後,將執行主從切換
主從切換過程: ①哨兵監控到主機sdwon時,向其他哨兵發送訊息,請求其他哨兵同步當前主機狀態
②一旦sdown滿足odown,這時,哨兵先執行選舉,選舉哨兵的leader
③哨兵選舉後,由哨兵的leader提升一個從機爲主機
④優先考慮slave-priority小的從機,如果優先順序都相同,考慮偏移量大
否則再考慮pid小的
將從機提升爲主機
⑤讓其他存活的從機,從新認新主
⑥如果之前的主機,重新啓動,需要變更身份,作爲從機,認新主