# 3.6 持久化
##3.6.1 RDB方式(默認)
RDB方式的持久化是通過快照(snapshotting)完成的,當符合一定條件時Redis會自動將內存中的所有數據進行快照并存儲在硬 盤上。進行快照的條件可以由用戶在配置文件中自定義,由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵 的個數大于指定的數值時就會進行快照。RDB是Redis默認采用的持久化方式,在配置文件中已經預置了3個條件:
```bash
save 900 1 # 900秒內有至少1個鍵被更改則進行快照
save30010 #300秒內有至少10個鍵被更改則進行快照
save 60 10000 # 60秒內有至少10000個鍵被更改則進行快照
```
可以存在多個條件,條件之間是“或”的關系,只要滿足其中一個條件,就會進行快照。 如果想要禁用自動快照,只需要將所有的 save參數刪除即可。
>Redis默認會將快照文件存儲在當前目錄(可CONFIG GET dir來查看)的dump.rdb文件中,可以通過配置dir和dbfilename兩個參數分 別指定快照文件的存儲路徑和文件名。
### Redis實現快照的過程
Redis使用fork函數復制一份當前進程(父進程)的副本(子進程); 父進程繼續接收并處理客戶端發來的命令,而子進程開始將 內存中的數據寫入硬盤中的臨時文件; 當子進程寫入完所有數據后會用該臨時文件替換舊的RDB文件,至此一次快照操作完成。 在執行fork的時候操作系統(類Unix操作系統)會使用寫時復制(copy-on-write)策略,即fork函數發生的一刻父子進程共享同一 內存數據,當父進程要更改其中某片數據時(如執行一個寫命令 ),操作系統會將該片數據復制一份以保證子進程的數據不受影 響,所以新的RDB文件存儲的是執行fork一刻的內存數據。
Redis在進行快照的過程中不會修改RDB文件,只有快照結束后才會將舊的文件替換成新的,也就是說任何時候RDB文件都是完整的。這使得我們可以通過定時備份RDB文件來實現Redis數據庫備份。RDB文件是經過壓縮(可以配置rdbcompression參數以禁用壓縮節省CPU占用)的二進制格式,所以占用的空間會小于內存中的數據大小,更加利于傳輸。
除了自動快照,還可以手動發送SAVE或BGSAVE命令讓Redis執行快照,兩個命令的區別在于,前者是由主進程進行快照操作, 會阻塞住其他請求,后者會通過fork子進程進行快照操作。 Redis啟動后會讀取RDB快照文件,將數據從硬盤載入到內存。根據數 據量大小與結構和服務器性能不同,這個時間也不同。通常將一個記錄一千萬個字符串類型鍵、大小為1GB的快照文件載入到內 存中需要花費20~30秒鐘。 通過RDB方式實現持久化,一旦Redis異常退出,就會丟失最后一次快照以后更改的所有數據。這就 需要開發者根據具體的應用場合,通過組合設置自動快照條件的方式來將可能發生的數據損失控制在能夠接受的范圍。如果數據很 重要以至于無法承受任何損失,則可以考慮使用AOF方式進行持久化。
##3.6.2 AOF方式
默認情況下Redis沒有開啟AOF(append only file)方式的持久化,可以在redis.conf中通過appendonly參數開啟:
```bash
appendonly yes
```
>在啟動時Redis會逐個執行AOF文件中的命令來將硬盤中的數據載入到內存中,載入的速度相較RDB會慢一些
開啟AOF持久化后每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬盤中的AOF文件。AOF文件的保存位置和
RDB文件的位置相同,都是通過dir參數設置的,默認的文件名是appendonly.aof,可以通過appendfilename參數修改:
```bash
appendfilename appendonly.aof
```
配置redis自動重寫AOF文件的條件
```bash
auto-aof-rewrite-percentage100 #當目前的AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時會再次進行重寫
auto-aof-rewrite-min-size64mb #允許重寫的最小AOF文件大小
```
配置寫入AOF文件后,要求系統刷新硬盤緩存的機制
```bash
#appendfsyncalways #每次執行寫入都會執行同步,最安全也最慢
appendfsynceverysec #每秒執行一次同步操作
# appendfsync no # 不主動進行同步操作,而是完全交由操作系統來做(即每30秒一次),最快也最不安全 Redis允許同時開啟AOF和RDB,既保證了數據安全又使得進行備份等操作十分容易。此時重新啟動Redis后Redis會使用AOF文件來恢復數據
```
- 概要
- 1 分布式存儲fastDFS
- 1.1 fastDFS 通用介紹
- 1.2 fastDFS安裝和使用
- 1.3 基于fastDFS實現分布式
- 2 緩存數據庫redis快速搭建
- 2.1 環境安裝
- 2.2 redis數據類型
- 2.3 redis訂閱發布模式
- 2.4 redis事務
- 2.5 redis備份
- 3 redis詳細攻略
- 3.1 redis簡介
- 3.2 redis使用場景
- 3.3 redis基本操作
- 3.4 redis數據類型
- 3.4.1 字符串
- 3.4.2 HASH-字典
- 3.4.3 List-列表
- 3.4.4 Set-集合
- 3.4.5 Sorted Set-有序集合
- 3.4.6 訂閱-發布
- 3.4.7 事務
- 3.5 redis配置文件
- 3.6 持久化
- 3.7 redis性能測試
- 3.8 redis-C-API
- 3.9 redis-C++-API
- 3.10 總結與建議
- 4 memcache緩存數據庫
- 4.1 什么是memcached
- 4.2 memcached的特征
- 4.3 memcached的內存管理
- 4.4 如何使用memcached
- 4.5 memcached參數詳解
- 4.6 memcached安裝
- 4.7 memcached-C客戶端
- 4.8 memcached-C++客戶端
- 5 Nginx
- 6 FastCGI
- 6.1 CGI
- 6.2 FastCGI
- 6.3 Nginx與FastCGI
- 7 Nginx上部署fastDFS
- 8 項目概要
- 8.1 上傳文件功能
- 8.2 主界面顯示與下載文件功能
- 8.3 注冊功能
- 8.4 登陸功能
- 8.5 文件分類功能
- 8.6 個人網盤功能
- 8.8 秒傳功能