**node
Redis
**
NoSQL,即Not Only SQL ,一種開源的非關係型數據庫。數據都存在內存中,能夠支持數據的持久化。支持簡單的key-value模式。
支持的類型包括:
redis
- string字符串
redis內部存儲默認就是一個字符串,被redisObject引用. - list鏈表
簡單的字符串列表,按照插入順序進行排序,從頭部和或者尾部添加 - set集合
set集合是String類型的無序集合,集合成員惟一,不能出現重複的數據,經過哈希表實現的,因此添加,刪除,查找的時間複雜度都爲O(1)。 - zset有序集合
有序的set集合,每一個元素會關聯一個double類型的分數,根據分數成員從小到大排序,不容許成員重複,添加,刪除,查找的時間複雜度都爲O(1)。 - hash哈希類型
命令:hget,hset
適合存儲對象
Redis使用單線程+多路IO複用的技術數據庫
-
多路複用:阻塞IO(串行),非阻塞IO,IO多路複用服務器
-
IO複用包括:select,poll,epollapp
redis事務是一個單獨的隔離操做,事務中的全部命令都會序列化,按順序的執行,事務在執行的過程當中,不會被其餘客戶端的命令和請求打斷
操做事務的三個指令:
性能
- Multi 開始事務
- Exec 執行事務
- discard 中斷事務
悲觀鎖和樂觀鎖
悲觀鎖: 悲觀鎖每次去拿數據的時候都認爲別人會修改,因此每次拿數據的時候都會上鎖,這樣想拿到這個數據的人就會block直到它拿到鎖,傳統的關係型數據庫就是這種鎖機制。好比行鎖,表鎖,讀鎖,寫鎖都是在操做以前先上鎖。lua
樂觀鎖:很樂觀,每次拿數據的時候都認爲別人不會修改數據,因此不會上鎖,可是在更新數據的時候會判斷在此期間有沒有更新過數據,會使用版本號的機制,樂觀鎖適合用於多讀的應用類型,這樣能夠提升吞吐量。redis就是利用這種check-and-set機制來實現事務的。spa
redis事務的三個特性
單獨隔離操做:事務中的全部命令都會序列化,按順序的執行。事務執行過程當中不會被其餘客戶端發來的請求打斷
沒有隔離級別的概念:隊列中的命令在沒有提交以前都不會被實際的執行
不保證原子性:redis中同一個事務中有一條命令執行失敗的話,其餘的命令仍然會執行,沒有回滾
線程
持久化方式
Radis提供的2個不一樣形式的持久化方式
RDB:RedisDataBase 會將數據寫入到一個臨時文件中,等持久化過程結束了,再用這個臨時文件替換上次持久化好的文件。整個過程當中,主進程是不進行任何IO操做的,確保了極高的性能若是須要大規模數據的恢復,對數據恢復的完整性不敏感,容許丟失數據,RDB比AOF更加高效,RDB的缺點是最後一次持久化的數據可能丟失。
RDB持久化,知足RDB的保存策略,正常關閉redis,不然最後一次的數據會丟失。手動保存 命令save 只管保存,其餘無論,所有阻塞 save vs bgsave
當Redis沒法寫入磁盤時,直接關閉Redis的寫操做: stop-writes-on-bgsave-error yes
RDB保存時要進行壓縮: rdbcompression yes
RDB數據的備份:將*.rdb文件拷貝;
RDB數據的恢復:關閉Redis ,把備份的文件拷到redis工做目錄下,啓動redis,數據會自動加載
RDB優勢:節省磁盤空間,由於rdb存儲的是數據結果。恢復速度快
RDB缺點:redis在fork時使用了 寫時拷貝技術 ,數據龐大的話比較消耗性能。備份週期性,意外關閉會丟失最後一次的數據以及快照。
AOF:以日誌的形式記錄每個寫操做,記錄Redis執行過的寫指令,(讀操做不記錄),只容許追加文件,不能夠寫文件。redis啓動時會經過aof的文件從新構建數據,即從新將全部的指令執行一次來完成數據的恢復。
默認不開啓,須要在配置文件中手動開啓。 appendonly no ( 默認 )
保存路徑在redis的工做空間下,跟rdb保持一致。
AOF 和RDB同時開啓的話,AOF記錄數據的的優先級大於RDB。
aof文件中寫數據都是以 *$ 開頭 ,執行了flush的話 能夠將aof文件中的flush刪除,便可恢復數據。
AOF始終同步,每次Redis寫入都會當即記入日誌文件中
日誌
Rewrite :AOF採用的是文件追加的方式,避免文件過大,AOF增長了重寫機制,當AOF的大小超過所設定的閾值時,Redis會啓動AOF文件的內容壓縮,只保留能夠恢復的最小指令集,使用命令 bgrewriteaof 。若是保存了屢次key1的值,只會保留最後一次key1的值。
AOF如何實現重寫: AOF文件過大時,會fork出一條新的進程來說文件重寫,先寫進臨時文件中而後rename,最後覆蓋,會遍歷新進程中的每一條set語句。重寫的aof文件並無讀取舊的aof文件,而是將數據庫內容用命令的方式從新寫了一個aof文件
AOF重寫的條件和時機: 重寫能夠節省大量的磁盤空間,減小恢復的時間。可是重寫有必定的負擔,要設定redis知足必定的條件才能進行重寫。redis載入完畢時,redis會記錄此時aof的大小,而且設置爲base_size ,若是Redis的aof當前大小>=base_size+base_size8100%且當前大小>=64mb時重寫。默認狀況下。
AOF優勢:備份機制更加穩健,丟失數據的機率更低。日誌文件可讀性高,能夠處理誤操做。
AOF缺點:比起RDB佔用的磁盤空間更多,每次讀寫都同步的話,性能有必定的壓力。日誌文件存在個別BUG,形成不能恢復。
Redis主從複製
master/slave 一主多從 ,一寫多讀
讀寫分離,性能擴展 ,容災快速恢復。
主要減少讀 寫的壓力,並不能減少內存的壓力,由於須要同步數據,主從都是一樣的數據量。
Master 以寫爲主
Slave 以讀爲主
配置從服務器,不配置主服務器
拷貝多個redis.conf文(默認配置),而後使用include 包含默認配置,添加其餘不一樣的配置(include /?/?/redis.conf) 路徑文件
開啓 daemonize yes (後臺啓動)
指定端口號port
Log文件的名字
dbfilename 和 Appendonly 都要換名字或者關掉。 由於不能讓多臺服務器產生的rdb,aof文件重名。
打印主從複製的相關信息命令: info replication
成爲某個實例的從服務器: slaveof
一主二僕:從服務器切入後,主服務器和從服務器的數據永遠保持一致,無論從服務器何時加入。從服務器不能寫數據(set)。
主服務器shutdown後,從服務器會等待主服務器上線。
主從複製的原理:
每次從服務器聯通後,都會給主機發送sync的指令,主機會馬上進行存盤操做而且發送rdb文件給從服務器,從服務器接受rdb文件後進行全盤加載,以後每次主服務器寫操做時都會馬上發送給從服務器,從服務器會執行相同的指令。
薪火相傳
上一個從服務器能夠是下一個從服務器的主服務器,這個slave從服務器一樣能夠接受其餘slave從服務器的鏈接和同步請求,有效減輕主服務器的寫壓力,去中心化下降風險。
slaveof no one (此命令是不作任何一臺主服務器的從服務器) 在主服務器宕機以後,能夠用此命令將當前的從服務器提高爲主服務器,就能夠進行寫的操做了。
哨兵模式
sentinel
監控主機是否故障,若是故障會根據投票數自動將從服務器轉換爲主服務器。
sentinel.conf 文件 配置內容
sentinel monitor mymaster 127.0.0.1 6379 1
哨兵 1:表明 至少有一個哨兵認爲服務器宕機,那麼服務器就是宕機了
啓動哨兵命令 : redis-sentinel sentinel.conf
故障恢復
主服務器shutdown後,會在其全部的從服務器中挑選一個從服務器做爲新的主服務器,新的主服務器出來後,sentinel會向原主服務器發送slaveof 新主服務器的命令 ,複製新master主服務器。當舊的主服務器從新上線時,sentinel會向其發送slaveof命令,讓它成新主服務器的從服務器。
選擇的條件依次爲:
1.優先級靠前的,優先級在redis-conf 中改 slave-priority 100 ,值越小優先級越高
2.偏移量最大的,偏移量是指 從原主服務器獲取數據最多的
3.runid最小的從服務器,每一個redis實例啓動後都會隨機生成一個40位的runid
Redis 集羣
Redis集羣實現了對Redis的水平擴容,啓動N個Redis節點,將整個數據庫分佈存儲到這N個節點中,每一個節點存儲總數據的1/N。
Redis集羣經過分區來提供必定程度的可用性,即便集羣中的一部分節點失效或者沒法通信,集羣也能夠繼續處理命令請求
1.製做n個實例集羣的相關操做
-
製做n個實例
-
拷貝多個redis.conf 文件 而後include
-
開啓 daemonize yes 後臺啓動
-
改端口,log文件名字,rbd,aof文件的名字
2.redis cluster 配置修改
-
cluster-enabled yes 打開集羣模式
-
cluster-config-file nodes-6379.conf 設定節點配置文件名
-
cluster-node-timeout 15000 設定節點失聯的時間,超過該時間(ms),集羣自動進行主從切換
一個集羣中至少要有三個主節點
選項 --replicas 1 表示 咱們但願爲及羣衆的每一個主節點建立一個從節點
分配原則儘可能保證每一個主數據庫運行在不一樣的ip地址,每一個從庫和主庫不在同一個ip地址
slots 插槽(hash slot)
不在一個slot下的鍵值,是不能夠用mget,mset等來進行多鍵操做的,能夠用{ } 來定義組的概念,從而使key中{ } 的內容鍵值對放到同一個slot中去
集羣好處:
實現了擴容
分攤了壓力
無中心配置相對簡單
集羣的缺點: 多鍵操做不被支持 多鍵的Redis事務不被支持,lua腳本不被支持 舊項目要遷移至redis cluster 遷移難度大,複雜度大。