回答標題問題:不會丟失。
先來說說什么是數據持久化,為啥要進行數據持久化。
第一點:什么是數據持久化。
在緩存服務中,我們都了解,他說一種高速緩沖,存放於內存的一種服務。那么內存中的東西生命周期是什么呢?通常來說,當機器關閉的時候,內存中的數據都會清空,都不會存儲,那么下次開機的時候,不會出現之前的數據。那么為了防止這種情況突然發生,,我們通常都會對緩存做持久化操作。這里以redis為例
Redis提供了2中不同形式的持久化類型:
1.rdb(redis database)
原理:將redis在內存的數據庫中的數據定時dump到硬盤上,實現rdb持久化。
在rdb持久化過程中,是在規定的時間間隔之內將內存中的數據集快照寫入磁盤,實際操作過程是fork一個子進程,先將數據集寫入到臨時文件中,寫入成功后,再替換之前的文件,再用二進制壓縮存儲。那么此操作是一種間隔存儲的,類似一種快照形式。
在整個的持久化過程中,主進程是不會進行任何的IO操作的,這就確保了極高的性能,如果我們需要大規模的數據的恢復,且對於數據恢復的完整性不是非常敏感,那么rdb方式要比aof方式更加高效。但是rdb的缺點就是最后一次的持久化操作很有可能丟失,那么一發生丟失就是整個數據丟失,下次備份還是需要重頭開始。
那么從上面我們就可以總結出rdb的一個優缺點了:
優點:相較aof而言:rdb是比較磁盤空間的,他只是保持更新整個redis緩存中所有的數據的一個完整性。即,相當於在一定時間間隔內對redis緩存數據的一個持久化,采取一種臨時文件替換上一層保存的文件,比較節省空間的。
然后,rdb是針對數據的角度進行一個持久化的,那么當然我們進行反向導入的時候,這個時候,rdb是高效的。但是弊端也相對明顯,就是在每次fork redis中全數據的時候,會因數據量的增加而增加性能的消耗。
周期進行備份,但是如果突然停止,會丟失最后一次快照的修改。臨時文件會丟失。
2.aof(append of file)
原理:將redis的操作日志以追加的形式寫入到文件中。
通過只增不改,不刪方式。Aof持久化以日志的形式記錄服務器所處理的每一個寫、刪除操作,查詢操作不會記錄,文本的形式記錄,可以打開文件看到詳細的操作記錄。
那么此種操作就一種日志形式來進行一個記錄各種更新操作。會對每一次操作的命令進行一個記錄,那么在redis服務進行一個啟動的時候,會讀取日志中的命令,對redis中的數據進行一個恢復。
所以可以看出aof是一個粒度比較小的操作。精確到每一條操作。且每條操作的前后都不影響。
那么這個時候也可以對比出aof的一個優點所在了:
備份機制更加成熟穩健,對每一條操作都會有所記錄,那么就會大大的降低丟失率。
這是個日志形式的備份,那么我們就可以直接讀持久化文件。可以對其人為的操作。
但是就是因為他的粒度細致,並且只會增加數據,不會修改數據,那么這個時候會占用更多的磁盤空間。且正因為日志,那么恢復的時候,也要從日志中讀取出數據信息,進行一個反操作。那么粒度細,也會造成一定的性能壓力,每次變更都會新增日志記錄。官方也做出了一些聲明:存在個別bug,會造成不能恢復現象。