摘自 https://blog.csdn.net/tr1912/article/details/70197085?foxhandler=RssReadRenderProcessHandlerredis
1、redis的適用環境sql
首先做爲一個nosql的key—value組成的數據庫,它們能存儲的數據結構必須是簡單的,由於有關係的數據即便存儲進去以後查詢也是很困難的,而且對於海量的數據存儲仍是關係型數據庫比較合適。數據庫
舉一個把通常數據庫數據存儲到key-value中的例子:緩存
student數據結構
學號app
姓名nosql
年齡函數
班級性能
001.net
小明
18
2
key
value
student:001:姓名
小明
student:001:年齡
18
student:001:班級
2
聽從規則爲 key 表名:主鍵值:列名
value 列值
若是加上表關係的話還要複雜好幾倍的。
那麼什麼樣的數據適合存儲在非關係型數據庫中的呢?
一、關係不是很密切的的數據,好比用戶信息,班級信息,評論數量等等。
二、量比較大的數據,如訪問記錄等
三、訪問比較頻繁的數據,如用戶信息,訪問數量,最新微博等
2、持久化
那麼這麼多,這麼重要的數據都存儲在內存中,若是忽然斷電,豈不是很糟糕,因而就有了數據的持久化機制,這個其實就是把內存中的數據存儲到硬盤中,方便數據的持續存在,也能夠減小斷電形成的損失。
那麼咱們怎麼持久化數據呢?多長時間進行一次持久化呢?
redis 支持兩種持久化方式,一種是 Snapshotting(快照)也是默認方式,另外一種是 Append-only file(縮寫 aof)的方式。下面分別介紹:
一)、Snapshotting
快照是默認的持久化方式。這種方式是就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。能夠經過配置設置自動作快照持久化的方式。咱們能夠配置 redis在 n 秒內若是超過 m 個 key 被修改就自動作快照,下面是默認的快照保存配置:
save 900 1 #900 秒內若是超過 1 個 key 被修改,則發起快照保存
save 300 10 #300 秒內容如超過 10 個 key 被修改,則發起快照保存
save 60 10000
下面介紹詳細的快照保存過程:
1.redis 調用 fork,如今有了子進程和父進程。
2. 父進程繼續處理 client 請求,子進程負責將內存內容寫入到臨時文件。因爲 os 的實時複製機制( copy on write)父子進程會共享相同的物理頁面,當父進程處理寫請求時 os 會爲父進程要修改的頁面建立副本,而不是寫共享的頁面。因此子進程地址空間內的數據是 fork時刻整個數據庫的一個快照。
3.當子進程將快照寫入臨時文件完畢後,用臨時文件替換原來的快照文件,而後子進程退出。client 也可使用 save 或者 bgsave 命令通知 redis 作一次快照持久化。 save 操做是在主線程中保存快照的,因爲 redis 是用一個主線程來處理全部 client 的請求,這種方式會阻塞全部client 請求。因此不推薦使用。另外一點須要注意的是,每次快照持久化都是將內存數據完整寫入到磁盤一次,並非增量的只同步變動數據。若是數據量大的話,並且寫操做比較多,必然會引發大量的磁盤 io 操做,可能會嚴重影響性能。
二)、AOF方式
因爲快照方式是在必定間隔時間作一次的,因此若是 redis 意外 down 掉的話,就會丟失最後一次快照後的全部修改。若是應用要求不能丟失任何修改的話,能夠採用 aof 持久化方式。下面介紹 Append-only file:aof 比快照方式有更好的持久化性,是因爲在使用 aof 持久化方式時,redis 會將每個收到的寫命令都經過 write 函數追加到文件中(默認是 appendonly.aof)。當 redis 重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。固然因爲 os 會在內核中緩存 write 作的修改,因此可能不是當即寫到磁盤上。這樣 aof 方式的持久化也仍是有可能會丟失部分修改。不過咱們能夠經過配置文件告訴 redis 咱們想要經過 fsync 函數強制 os 寫入到磁盤的時機。有三種方式以下(默認是:每秒 fsync 一次)
appendonly yes //啓用 aof 持久化方式# appendfsync always //收到寫命令就當即寫入磁盤,最慢,可是保證徹底的持久化appendfsync everysec //每秒鐘寫入磁盤一次,在性能和持久化方面作了很好的折中# appendfsync no //徹底依賴 os,性能最好,持久化沒保證 aof 的方式也同時帶來了另外一個問題。持久化文件會變的愈來愈大。例如咱們調用 incr test命令 100 次,文件中必須保存所有的 100 條命令,其實有 99 條都是多餘的。由於要恢復數據庫的狀態其實文件中保存一條 set test 100 就夠了。爲了壓縮 aof 的持久化文件。 redis 提供了 bgrewriteaof 命令。收到此命令 redis 將使用與快照相似的方式將內存中的數據以命令的方式保存到臨時文件中,最後替換原來的文件。--------------------- 做者:王嘯tr1912 來源:CSDN 原文:https://blog.csdn.net/tr1912/article/details/70197085 版權聲明:本文爲博主原創文章,轉載請附上博文連接!