redis體系架構及一些認知
Redis是NoSQL資料庫的一種Redis是以KV方式儲存資料庫
特點:非關係,分佈,開源,可擴充套件,高速記憶體操作。
適合執行在廉價的pc伺服器上分散式處理海量資料
Redis是一個開源的,先進的kv儲存方式的資料庫,通常叫資料結構伺服器,鍵可以包含字串strings,雜湊hashes,lists連結串列,集合sets,有序集合sorted sets/zsets,這些資料型別支援push,pop,add,move及集合等操作,支援各種不同方式排序,為了提供效能,資料都在記憶體中,為了資料可靠根據需要週期更新資料到磁碟或日誌記錄檔案.
網際網路資料目前基本使用兩種方式來儲存,關係資料庫或者key value。但是這些網際網路業務本身並不屬於這兩種資料型別,比如使用者在社會化平臺中的關係,它是一個list,如果要用關係資料庫儲存就需要轉換成一種多行記錄的形式,這種形式存在很多冗餘資料,每一行需要儲存一些重複資訊。如果用key value儲存則修改和刪除比較麻煩,需要將全部資料讀出再寫入。Redis在記憶體中設計了各種資料型別,讓業務能夠高速原子的訪問這些資料結構,並且不需要關心持久儲存的問題,從架構上解決了前面兩種儲存需要走一些彎路的問題.
Redis 新版本增加了VM特性。讓Redis資料容量突破了實體記憶體的限制。並實現了資料冷熱分離。用get/set方式使用Redis
作為一個key value存在,很多開發者自然的使用set/get方式來使用Redis,實際上這並不是最優化的使用方法。尤其在未啟用VM情況下,Redis全部資料需要放入記憶體,節約記憶體尤其重要。假如一個key-value單元需要最小佔用512位元組,即使只存一個位元組也佔了512位元組。這時候就有一個設計模式,可以把key複用,幾個key-value放入一個key中,value再作為一個set存入,這樣同樣512位元組就會存放10-100倍的容量。
AOF和RDB兩種方式的高可用
Redis有兩種儲存方式,預設是RDB方式,實現方法是定時將記憶體的快照(snapshot)持久化到硬碟,這種方法缺點是持久化之後如果出現crash則會丟失一段資料,因為RDB是在某個時間點將資料寫入一個臨時檔案,持久化結束後,用這個臨時檔案替換上次持久化的檔案,達到資料恢復。 優點:使用單獨子程序來進行持久化,主程序不會進行任何IO操作,保證了redis的高效能 缺點:RDB是間隔一段時間進行持久化,如果持久化之間redis發生故障,會發生資料丟失。所以這種方式更適合資料要求不嚴謹的時候。
因此在完美主義者的推動下作者增加了AOF方式。aof即append only file(append only mode),在寫入記憶體資料的同時將操作命令儲存到日誌檔案,在一個併發更改上萬的系統中,命令日誌是一個非常龐大的資料,管理維護成本非常高,恢復重建時間會非常長,這樣導致失去aof高可用性本意。另外更重要的是Redis是一個記憶體資料結構模型,所有的優勢都是建立在對記憶體複雜資料結構高效的原子操作上,這樣就看出aof是一個非常不協調的部分。
aof目的主要是資料可靠性及高可用性,可以保持更高的資料完整性,如果設定追加file的時間是1s,如果redis發生故障,最多會丟失1s的資料;且如果日誌寫入不完整支援redis-check-aof來進行日誌修復;AOF檔案沒被rewrite之前(檔案過大時會對命令進行合併重寫),可以刪除其中的某些命令(比如誤操作的flushall)。 缺點:AOF檔案比RDB檔案大,且恢復速度慢。在Redis中還有另外一種方法來達到目的:Replication。由於Redis的高效能,複製基本沒有延遲。這樣達到了防止單點故障及實現了高可用。
redis 的備份模式:
容災模式: