Redis是一個高性能的key-value資料庫。
Redis支援資料的持久化,可以将記憶體中的資料儲存在磁盤中,重新開機的時候可以再次加載進行使用。
Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。
Redis支援資料的備份,即master-slave模式的資料備份。
為了更好的使用redis,我們需要詳細的了解redis配置檔案及相關參數作用。
include /path/to/local.conf
額外載入配置檔案,如果有需要的話,可以開啟此配置
bind 127.0.0.1
bind 192.168.1.100
綁定redis伺服器網卡IP,預設為127.0.0.1,即本地回環位址。這樣的話,通路redis服務隻能通過本機的用戶端連接配接,而無法通過遠端連接配接。如果bind選項為空的話,那會接受所有來自于可用網絡接口的連接配接。如上配置,綁定一個127.0.0.1的本機位址和192.168.1.100的外網位址。
protected-mode yes
保護模式,預設是開啟狀态,隻允許本地用戶端連接配接, 可以設定密碼或添加bind來連接配接
port 6379
監聽端口号,預設為6379,如果設為0,redis将不在socket 上監聽任何用戶端連接配接
tcp-backlog 511
TCP監聽的最大容納數量,在高并發的環境下,你需要把這個值調高以避免用戶端連接配接緩慢的問題。Linux 核心會把這個值縮小成 /proc/sys/net/core/somaxconn對應的值,要提升并發量需要修改這兩個值才能達到目的
unixsocket /tmp/redis.sock
unixsocketperm 700
指定redis監聽的unix socket路徑,預設不啟用,unixsocketper指定檔案的權限
timeout 0
指定在一個 client 空閑多少秒之後關閉連接配接(0表示永不關閉)
tcp-keepalive 300
機關是秒,表示将周期性的使用SO_KEEPALIVE檢測用戶端是否還處于健康狀态,避免伺服器一直阻塞,官方給出的建議值是300s,如果設定為0,則不會周期性的檢測
daemonize yes
預設情況下 redis 不是作為守護程序運作的,如果你想讓它在背景運作,你就把它改成 yes。當redis作為守護程序運作的時候,它會寫一個 pid 到 /var/run/redis.pid 檔案裡面
supervised no
可以通過upstart和systemd管理Redis守護程序
選項:
supervised no - 沒有監督互動
supervised upstart - 通過将Redis置于SIGSTOP模式來啟動信号
supervised systemd - signal systemd将READY = 1寫入$ NOTIFY_SOCKET
supervised auto - 檢測upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET環境變量
pidfile /var/redis/run/redis_6379.pid
配置PID檔案路徑,當redis作為守護程序運作的時候,它會把 pid 預設寫到 /var/redis/run/redis_6379.pid 檔案裡面
loglevel notice
定義日志級别。
可以是下面的這些值:
debug(記錄大量日志資訊,适用于開發、測試階段)
verbose(較多日志資訊)
notice(适量日志資訊,使用于生産環境)
warning(僅有部分重要、關鍵資訊才會被記錄)
logfile /var/redis/log/redis_6379.log
日志檔案的位置,當指定為空字元串時,為标準輸出,如果redis已守護程序模式運作,那麼日志将會輸出到/dev/null
syslog-enabled no
要想把日志記錄到系統日志,就把它改成 yes,也可以可選擇性的更新其他的syslog 參數以達到你的要求
syslog-ident redis
設定系統日志的ID
syslog-facility local0
指定系統日志設定,必須是 USER 或者是 LOCAL0-LOCAL7 之間的值
databases 16
設定資料庫的數目。預設的資料庫是DB 0 ,可以在每個連接配接上使用select <dbid> 指令選擇一個不同的資料庫,dbid是一個介于0到databases - 1 之間的數值。
save 900 1
save 300 10
save 60 10000
存 DB 到磁盤:
格式:save <間隔時間(秒)> <寫入次數>
根據給定的時間間隔和寫入次數将資料儲存到磁盤
下面的例子的意思是:
900 秒内如果至少有 1 個 key 的值變化,則儲存
300 秒内如果至少有 10 個 key 的值變化,則儲存
60 秒内如果至少有 10000 個 key 的值變化,則儲存
注意:你可以注釋掉所有的 save 行來停用儲存功能。
也可以直接一個空字元串來實作停用:
save ""
stop-writes-on-bgsave-error yes
如果使用者開啟了RDB快照功能,那麼在redis持久化資料到磁盤時如果出現失敗,預設情況下,redis會停止接受所有的寫請求。
這樣做的好處在于可以讓使用者很明确的知道記憶體中的資料和磁盤上的資料已經存在不一緻了。
如果redis不顧這種不一緻,一意孤行的繼續接收寫請求,就可能會引起一些災難性的後果。
如果下一次RDB持久化成功,redis會自動恢複接受寫請求。
如果不在乎這種資料不一緻或者有其他的手段發現和控制這種不一緻的話,可以關閉這個功能,
以便在快照寫入失敗時,也能確定redis繼續接受新的寫請求。
rdbcompression yes
對于存儲到磁盤中的快照,可以設定是否進行壓縮存儲。
如果是的話,redis會采用LZF算法進行壓縮。如果你不想消耗CPU來進行壓縮的話,
可以設定為關閉此功能,但是存儲在磁盤上的快照會比較大。
rdbchecksum yes
在存儲快照後,我們還可以讓redis使用CRC64算法來進行資料校驗,但是這樣做會增加大約10%的性能消耗,
如果希望擷取到最大的性能提升,可以關閉此功能。
dbfilename dump.rdb
設定快照的檔案名
dir /var/redis/6379
設定快照檔案的存放路徑,這個配置項一定是個目錄,而不能是檔案名
slaveof <masterip> <masterport>
主從複制,使用 slaveof 來讓一個 redis 執行個體成為另一個reids 執行個體的副本,預設關閉
注意這個隻需要在 slave 上配置
masterauth <master-password>
如果 master 需要密碼認證,就在這裡設定,預設不設定
slave-serve-stale-data yes
當一個 slave 與 master 失去聯系,或者複制正在進行的時候,
slave 可能會有兩種表現:
1) 如果為 yes ,slave 仍然會應答用戶端請求,但傳回的資料可能是過時,
或者資料可能是空的在第一次同步的時候
2) 如果為 no ,在你執行除了 info he salveof 之外的其他指令時,
slave 都将傳回一個 "SYNC with master in progress" 的錯誤
slave-read-only yes
你可以配置一個 slave 實體是否接受寫入操作。
通過寫入操作來存儲一些短暫的資料對于一個 slave 執行個體來說可能是有用的,
因為相對從 master 重新同步數而言,據資料寫入到 slave 會更容易被删除。
但是如果用戶端因為一個錯誤的配置寫入,也可能會導緻一些問題。
從 redis 2.6 版起,預設 slaves 都是隻讀的。
repl-diskless-sync no
主從資料複制是否使用無硬碟複制功能。
新的從站和重連後不能繼續備份的從站,需要做所謂的“完全備份”,即将一個RDB檔案從主站傳送到從站。
這個傳送有以下兩種方式:
1)硬碟備份:redis主站建立一個新的程序,用于把RDB檔案寫到硬碟上。過一會兒,其父程序遞增地将檔案傳送給從站。
2)無硬碟備份:redis主站建立一個新的程序,子程序直接把RDB檔案寫到從站的套接字,不需要用到硬碟。
在硬碟備份的情況下,主站的子程序生成RDB檔案。一旦生成,多個從站可以立即排成隊列使用主站的RDB檔案。
在無硬碟備份的情況下,一次RDB傳送開始,新的從站到達後,需要等待現在的傳送結束,才能開啟新的傳送。
如果使用無硬碟備份,主站會在開始傳送之間等待一段時間(可配置,以秒為機關),希望等待多個子站到達後并行傳送。
在硬碟低速而網絡高速(高帶寬)情況下,無硬碟備份更好。
repl-diskless-sync-delay 5
當啟用無硬碟備份,伺服器等待一段時間後才會通過套接字向從站傳送RDB檔案,這個等待時間是可配置的。
這一點很重要,因為一旦傳送開始,就不可能再為一個新到達的從站服務。從站則要排隊等待下一次RDB傳送。是以伺服器等待一段
時間以期更多的從站到達。
延遲時間以秒為機關,預設為5秒。要關掉這一功能,隻需将它設定為0秒,傳送會立即啟動。
repl-ping-slave-period 10
從redis會周期性的向主redis發出PING包,你可以通過repl_ping_slave_period指令來控制其周期,預設是10秒。
repl-timeout 60
接下來的選項為以下内容設定備份的逾時時間:
1)從從站的角度,同步期間的批量傳輸的I/O
2)從站角度認為的主站逾時(資料,ping)
3)主站角度認為的從站逾時(REPLCONF ACK pings)
确認這些值比定義的repl-ping-slave-period要大,否則每次主站和從站之間通信低速時都會被檢測為逾時。
repl-disable-tcp-nodelay no
同步之後是否禁用從站上的TCP_NODELAY
如果你選擇yes,redis會使用較少量的TCP包和帶寬向從站發送資料。但這會導緻在從站增加一點資料的延時。
Linux核心預設配置情況下最多40毫秒的延時。
如果選擇no,從站的資料延時不會那麼多,但備份需要的帶寬相對較多。
預設情況下我們将潛在因素優化,但在高負載情況下或者在主從站都跳的情況下,把它切換為yes是個好主意。
repl-backlog-size 1mb
設定備份的工作儲備大小。工作儲備是一個緩沖區,當從站斷開一段時間的情況時,它替從站接收存儲資料,
是以當從站重連時,通常不需要完全備份,隻需要一個部分同步就可以,即把從站斷開時錯過的一部分資料接收。
工作儲備越大,從站可以斷開并稍後執行部分同步的斷開時間就越長。
隻要有一個從站連接配接,就會立刻配置設定一個工作儲備。
repl-backlog-ttl 3600
主站有一段時間沒有與從站連接配接,對應的工作儲備就會自動釋放。
這個選項用于配置釋放前等待的秒數,秒數從斷開的那一刻開始計算,值為0表示不釋放。
slave-priority 100
從站優先級是可以從redis的INFO指令輸出中查到的一個整數。當主站不能正常工作時
redis sentinel使用它來選擇一個從站并将它提升為主站。
低優先級的從站被認為更适合于提升,是以如果有三個從站優先級分别是10,
100,25,sentinel會選擇優先級為10的從站,因為它的優先級最低。
然而優先級值為0的從站不能執行主站的角色,是以優先級為0的從站永遠不會被redis sentinel提升。
預設優先級是100
min-slaves-to-write 3
min-slaves-max-lag 10
主站可以停止接受寫請求,當與它連接配接的從站少于N個,滞後少于M秒,N個從站必須是線上狀态。
延遲的秒數必須<=所定義的值,延遲秒數是從最後一次收到的來自從站的ping開始計算。ping通常是每秒一次。
這一選項并不保證N個備份都會接受寫請求,但是會限制在指定秒數内由于從站數量不夠導緻的寫操作丢失的情況。
如果想要至少3個從站且延遲少于10秒,如上配置即可
slave-announce-ip 5.5.5.5
slave-announce-port 1234
Redis master能夠以不同的方式列出所連接配接slave的位址和端口。
例如,“INFO replication”部分提供此資訊,除了其他工具之外,Redis Sentinel還使用該資訊來發現slave執行個體。
此資訊可用的另一個地方在masterser的“ROLE”指令的輸出中。
通常由slave報告的列出的IP和位址,通過以下方式獲得:
IP:通過檢查slave與master連接配接使用的套接字的對等體位址自動檢測位址。
端口:端口在複制握手期間由slavet通信,并且通常是slave正在使用列出連接配接的端口。
然而,當使用端口轉發或網絡位址轉換(NAT)時,slave實際上可以通過(不同的IP和端口對)來到達。 slave可以使用以下兩個選項,以便向master報告一組特定的IP和端口,
以便INFO和ROLE将報告這些值。
如果你需要僅覆寫端口或IP位址,則沒必要使用這兩個選項。
requirepass foobared
設定redis連接配接密碼
rename-command CONFIG ""
将指令重命名,為了安全考慮,可以将某些重要的、危險的指令重命名。
當你把某個指令重命名成空字元串的時候就等于取消了這個指令。
maxclients 10000
設定用戶端最大并發連接配接數,預設無限制,Redis可以同時打開的用戶端連接配接數為Redis程序可以打開的最大檔案
描述符數-32(redis server自身會使用一些),如果設定 maxclients為0
表示不作限制。當用戶端連接配接數到達限制時,Redis會關閉新的連接配接并向用戶端傳回max number of clients reached錯誤資訊
maxmemory <bytes>
指定Redis最大記憶體限制,Redis在啟動時會把資料加載到記憶體中,達到最大記憶體後,Redis會先嘗試清除已到期或即将到期的Key
當此方法處理 後,仍然到達最大記憶體設定,将無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,
會把Key存放記憶體,Value會存放在swap區,格式:maxmemory <bytes>
maxmemory-policy noeviction
當記憶體使用達到最大值時,redis使用的清楚政策。有以下幾種可以選擇:
1)volatile-lru 利用LRU算法移除設定過過期時間的key (LRU:最近使用 Least Recently Used )
2)allkeys-lru 利用LRU算法移除任何key
3)volatile-random 移除設定過過期時間的随機key
4)allkeys-random 移除随機ke
5)volatile-ttl 移除即将過期的key(minor TTL)
6)noeviction noeviction 不移除任何key,隻是傳回一個寫錯誤 ,預設選項
maxmemory-samples 5
LRU 和 minimal TTL 算法都不是精準的算法,但是相對精确的算法(為了節省記憶體)
随意你可以選擇樣本大小進行檢,redis預設選擇3個樣本進行檢測,你可以通過maxmemory-samples進行設定樣本數
appendonly no
預設redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。但是redis如果中途當機,
會導緻可能有幾分鐘的資料丢失,根據save來政策進行持久化,Append Only File是另一種持久化方式,
可以提供更好的持久化特性。Redis會把每次寫入的資料在接收後都寫入appendonly.aof檔案,
每次啟動時Redis都會先把這個檔案的資料讀入記憶體裡,先忽略RDB檔案。
appendfilename "appendonly.aof"
aof檔案名
appendfsync always
appendfsync everysec
appendfsync no
aof持久化政策的配置
no表示不執行fsync,由作業系統保證資料同步到磁盤,速度最快。
always表示每次寫入都執行fsync,以保證資料同步到磁盤。
everysec表示每秒執行一次fsync,可能會導緻丢失這1s資料
no-appendfsync-on-rewrite no
在aof重寫或者寫入rdb檔案的時候,會執行大量IO,此時對于everysec和always的aof模式來說,
執行fsync會造成阻塞過長時間,no-appendfsync-on-rewrite字段設定為預設設定為no。
如果對延遲要求很高的應用,這個字段可以設定為yes,否則還是設定為no,這樣對持久化特性來說這是更安全的選擇。
設定為yes表示rewrite期間對新寫操作不fsync,暫時存在記憶體中,等rewrite完成後再寫入,預設為no,建議yes。
Linux的預設fsync政策是30秒。可能丢失30秒資料。
auto-aof-rewrite-percentage 100
aof自動重寫配置,當目前aof檔案大小超過上一次重寫的aof檔案大小的百分之多少進行重寫,
即當aof檔案增長到一定大小的時候,Redis能夠調用bgrewriteaof對日志檔案進行重寫。
目前AOF檔案大小是上次日志重寫得到AOF檔案大小的二倍(設定為100)時,自動啟動新的日志重寫過程。
auto-aof-rewrite-min-size 64mb
設定允許重寫的最小aof檔案大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫
aof-load-truncated yes
aof檔案可能在尾部是不完整的,當redis啟動的時候,aof檔案的資料被載入記憶體。
重新開機可能發生在redis所在的主機作業系統當機後,尤其在ext4檔案系統沒有加上data=ordered選項,出現這種現象
redis當機或者異常終止不會造成尾部不完整現象,可以選擇讓redis退出,或者導入盡可能多的資料。
如果選擇的是yes,當截斷的aof檔案被導入的時候,會自動釋出一個log給用戶端然後load。
如果是no,使用者必須手動redis-check-aof修複AOF檔案才可以。
lua-time-limit 5000
如果達到最大時間限制(毫秒),redis會記個log,然後傳回error。當一個腳本超過了最大時限。
隻有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個可以殺沒有調write指令的東西。
要是已經調用了write,隻能用第二個指令殺
cluster-enabled yes
叢集開關,預設是不開啟叢集模式
cluster-config-file nodes-6379.conf
叢集配置檔案的名稱,每個節點都有一個叢集相關的配置檔案,持久化儲存叢集的資訊。
這個檔案并不需要手動配置,這個配置檔案有Redis生成并更新,每個Redis叢集節點需要一個單獨的配置檔案
請確定與執行個體運作的系統中配置檔案名稱不沖突
cluster-node-timeout 15000
節點互連逾時的閥值,叢集節點逾時毫秒數
cluster-slave-validity-factor 10
在進行故障轉移的時候,全部slave都會請求申請為master,但是有些slave可能與master斷開連接配接一段時間了,
導緻資料過于陳舊,這樣的slave不應該被提升為master。該參數就是用來判斷slave節點與master斷線的時間是否過長。
判斷方法是:
比較slave斷開連接配接的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period
如果節點逾時時間為三十秒, 并且slave-validity-factor為10,
假設預設的repl-ping-slave-period是10秒,即如果超過310秒slave将不會嘗試進行故障轉移
cluster-migration-barrier 1
master的slave數量大于該值,slave才能遷移到其他孤立master上,如這個參數若被設為2,
那麼隻有當一個主節點擁有2 個可工作的從節點時,它的一個從節點會嘗試遷移。
cluster-require-full-coverage yes
預設情況下,叢集全部的slot有節點負責,叢集狀态才為ok,才能提供服務。
設定為no,可以在slot沒有全部配置設定的時候提供服務。
不建議打開該配置,這樣會造成分區的時候,小分區的master一直在接受寫請求,而造成很長時間資料不一緻
slowlog-log-slower-than 10000
slog log是用來記錄redis運作中執行比較慢的指令耗時。
當指令的執行超過了指定時間,就記錄在slow log中,slog log儲存在記憶體中,是以沒有IO操作。
執行時間比slowlog-log-slower-than大的請求記錄到slowlog裡面,機關是微秒,是以1000000就是1秒。
注意,負數時間會禁用慢查詢日志,而0則會強制記錄所有指令。
slowlog-max-len 128
慢查詢日志長度。當一個新的指令被寫進日志的時候,最老的那個記錄會被删掉,這個長度沒有限制。
隻要有足夠的記憶體就行,你可以通過 SLOWLOG RESET 來釋放記憶體
latency-monitor-threshold 0
延遲監控功能是用來監控redis中執行比較緩慢的一些操作,用LATENCY列印redis執行個體在跑指令時的耗時圖表。
隻記錄大于等于下邊設定的值的操作,0的話,就是關閉監視。
預設延遲監控功能是關閉的,如果你需要打開,也可以通過CONFIG SET指令動态設定。
notify-keyspace-events ""
鍵空間通知使得用戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 資料集的事件。因為開啟鍵空間通知功能需要消耗一些 CPU ,是以在預設配置下,該功能處于關閉狀态。
notify-keyspace-events 的參數可以是以下字元的任意組合,它指定了伺服器該發送哪些類型的通知:
K 鍵空間通知,所有通知以 __keyspace@__ 為字首
E 鍵事件通知,所有通知以 __keyevent@__ 為字首
g DEL 、 EXPIRE 、 RENAME 等類型無關的通用指令的通知
$ 字元串指令的通知
l 清單指令的通知
s 集合指令的通知
h 哈希指令的通知
z 有序集合指令的通知
x 過期事件:每當有過期鍵被删除時發送
e 驅逐(evict)事件:每當有鍵因為 maxmemory 政策而被删除時發送
A 參數 g$lshzxe 的别名
輸入的參數中至少要有一個 K 或者 E,否則的話,不管其餘的參數是什麼,都不會有任何 通知被分發。
hash-max-ziplist-entries 512
hash類型的資料結構在編碼上可以使用ziplist和hashtable。
ziplist的特點就是檔案存儲(以及記憶體存儲)所需的空間較小,在内容較小時,性能和hashtable幾乎一樣。
是以redis對hash類型預設采取ziplist。如果hash中條目的條目個數或者value長度達到閥值,将會被重構為hashtable。
這個參數指的是ziplist中允許存儲的最大條目個數,,預設為512,建議為128
hash-max-ziplist-value 64
ziplist中允許條目value值最大位元組數,預設為64,建議為1024
list-max-ziplist-size -2
當取正值的時候,表示按照資料項個數來限定每個quicklist節點上的ziplist長度。比如,當這個參數配置成5的時候,表示每個quicklist節點的ziplist最多包含5個資料項。
當取負值的時候,表示按照占用位元組數來限定每個quicklist節點上的ziplist長度。這時,它隻能取-1到-5這五個值,每個值含義如下:
-5: 每個quicklist節點上的ziplist大小不能超過64 Kb。(注:1kb => 1024 bytes)
-4: 每個quicklist節點上的ziplist大小不能超過32 Kb。
-3: 每個quicklist節點上的ziplist大小不能超過16 Kb。
-2: 每個quicklist節點上的ziplist大小不能超過8 Kb。(-2是Redis給出的預設值)
-1: 每個quicklist節點上的ziplist大小不能超過4 Kb。
list-compress-depth 0
這個參數表示一個quicklist兩端不被壓縮的節點個數。
注:這裡的節點個數是指quicklist雙向連結清單的節點個數,而不是指ziplist裡面的資料項個數。
實際上,一個quicklist節點上的ziplist,如果被壓縮,就是整體被壓縮的。
參數list-compress-depth的取值含義如下:
0: 是個特殊值,表示都不壓縮。這是Redis的預設值。
1: 表示quicklist兩端各有1個節點不壓縮,中間的節點壓縮。
2: 表示quicklist兩端各有2個節點不壓縮,中間的節點壓縮。
3: 表示quicklist兩端各有3個節點不壓縮,中間的節點壓縮。
依此類推…
由于0是個特殊值,很容易看出quicklist的頭節點和尾節點總是不被壓縮的,以便于在表的兩端進行快速存取。
set-max-intset-entries 512
資料量小于等于set-max-intset-entries用intset,大于set-max-intset-entries用set
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
資料量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset
hll-sparse-max-bytes 3000
value大小小于等于hll-sparse-max-bytes使用稀疏資料結構(sparse)
大于hll-sparse-max-bytes使用稠密的資料結構(dense),一個比16000大的value是幾乎沒用的,
建議的value大概為3000。如果對CPU要求不高,對空間要求較高的,建議設定到10000左右
activerehashing yes
Redis将在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低記憶體的使用。
當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。
如果沒有這麼嚴格的實時性要求,可以設定為yes,以便能夠盡可能快的釋放記憶體
client-output-buffer-limit normal 0 0 0
對用戶端輸出緩沖進行限制可以強迫那些不從伺服器讀取資料的用戶端斷開連接配接,用來強制關閉傳輸緩慢的用戶端。
對于normal client,第一個0表示取消hard limit,第二個0和第三個0表示取消soft limit,normal client預設取消限制,因為如果沒有尋問,他們是不會接收資料的
client-output-buffer-limit slave 256mb 64mb 60
對于slave client和MONITER client,如果client-output-buffer一旦超過256mb,又或者超過64mb持續60秒,那麼伺服器就會立即斷開用戶端連接配接。
client-output-buffer-limit pubsub 32mb 8mb 60
對于pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續60秒,那麼伺服器就會立即斷開用戶端連接配接。
hz 10
redis執行任務的頻率為1s除以hz
aof-rewrite-incremental-fsync yes
在aof重寫的時候,如果打開了aof-rewrite-incremental-fsync開關,系統會每32MB執行一次fsync。
這對于把檔案寫入磁盤是有幫助的,可以避免過大的延遲峰值