標籤:
# redis version 2.8.19 # 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes # 只用最新的,所以可以放到最後。# include /path/to/local.conf
# include /path/to/other.conf ################################ 通用 ##################################### # 是否後台執行daemonize yes # 後台執行的pid檔案
# pidfile /var/run/redis.pid # 0的話,不接受TCP串連port 6379 # TCP listen() backlog. 雖然listen有兩個參數int listen(int s, int backlog); 但是第二個參數會被/proc/sys/net/core/somaxconn覆蓋。比如nginx設定的是511,但是也會被這個覆蓋成預設的128,# 所以要/etc/sysctl.conf中添加net.core.somaxconn = 2048 然後 sysctl -p ,就是說,如果軟體佈建大於linux配置,就是linux配置,軟體佈建小於linux,就用軟體的,就是用最小的那個。tcp-backlog 511 # 綁定IP請求來源# bind 192.168.1.100 10.0.0.1 # 在空閑多少秒後關閉連結(0是禁用此功能)timeout 0 # TCP keepalive# Linux核心裡,下邊的值以秒記,相當於tcp_keepalive_time,要用兩倍的這個時間才能殺死(畫外音,也就是probes*intvl=如下的值了,詳見EverNote搜尋“linux 線上服務器最佳化配置”)# 設成60比較好tcp-keepalive 0 # 日誌記錄等級debug》verbose》notice(生產環境)》warningloglevel notice # 日誌名。Null 字元串意味著輸出到 標準輸出。後台啟動並執行redis標準輸出是/dev/null。(畫外音,所以要設定個檔案名稱)logfile "" # 是否把log記到系統日誌裡。標示是什嗎?# syslog-enabled no# syslog-ident redis #設定db的數量,預設db是0,你可以用SELECT <dbid> dbid在0到下邊的值-1;databases 16 ################################ 快照 ################################ # 儲存時間間隔,更新數量。如果1個key更新了,15min儲存一次。10個key更新了,5分鐘儲存一次,10000個key更新了,每1分鐘儲存一次。主動調用SAVE()會阻塞所有用戶端!一般是BGSAVE非同步。save 900 1save 300 10save 60 10000 # 如果最後一次的後台儲存RDB snapshot出錯,redis就會拒絕所有寫請求。這樣也相當於一個警示吧。等後台儲存繼續工作後,redis就允許寫了。# 如果你自己配置好了redis的持久化進程的監控,你可以關閉下邊:stop-writes-on-bgsave-error yes # 是否壓縮dump後的 .rdb 資料庫?預設壓縮。會省硬碟,但耗CPU。rdbcompression no # 是否校正rdb快照?CRC64校正值會放在檔案尾部。會導致10%效能下降。關閉後,校正值用0填充rdbchecksum yes # DB名稱dbfilename dump.rdb # 工作目錄# DB會寫入這個目錄,以上邊的名字。“僅追加檔案”也會存在這個目錄。注意:這裡必須是目錄名,不能是檔案名稱!dir ./
################################# 複製集 ################################# # 主從複製。用slaveof去複製另一份redis。# 1)redis複製是非同步。但你可以讓主redis拒絕寫請求,當少於某個個數的從redis線上。# 2)如果複製進程暫停了一小會兒,slave可以進行重新進行部分同步,你可以設定一下複製backlog大小# 3)是自動的,無需幹預。 # slaveof <masterip> <masterport> # 如果主機需要鑒權,則需要配置密碼# masterauth <master-password> # 當slave和master斷了,會有兩種情況:# 1)預設:slave-serve-stale-data yes 這時,slave接受請求並返回老資料# 2)如果是no了,則對任何命令都返回SYNC with master in progress,INFO和SLAVEOF命令除外!slave-serve-stale-data yes # 2.6之後,redis預設slave都是read-only的,但是slave預設可以執行所有管理員命令。CONFIG,DEBUG等。你可以用rename-command去重新命名危險的命令,隱藏他們。slave-read-only yes # 複製集同步策略:磁碟或者socket# 新slave串連或者老slave重新串連時候不能只接收不同,得做一個全同步。需要一個新的RDB檔案dump出來,然後從master傳到slave。可以有兩種情況:# 1)基於硬碟(disk-backed):master建立一個新進程dump RDB,完事兒之後由父進程(即主進程)增量傳給slaves。# 2)基於socket(diskless):master建立一個新進程直接dump RDB到slave的socket,不經過主進程,不經過硬碟。# 基於硬碟的話,RDB檔案建立後,一旦建立完畢,可以同時服務更多的slave。基於socket的話, 新slave來了後,得排隊(如果超出了repl-diskless-sync-delay還沒來),完事兒一個再進行下一個。# 當用diskless的時候,master等待一個repl-diskless-sync-delay的秒數,如果沒slave來的話,就直接傳,後來的得排隊等了。否則就可以一起傳。# disk較慢,並且網路較快的時候,可以用diskless。(預設用disk-based)repl-diskless-sync no# 設定成0的話,傳輸開始ASAPrepl-diskless-sync-delay 5 # Slave發送ping給master。預設10s# repl-ping-slave-period 10 # 逾時時間,包括從master看slave,從slave看master,要大於上邊的repl-ping-slave-period# repl-timeout 60 # SYNC完畢後,在slave的socket裡關閉TCP_NODELAY。# 如果是yes,reids發送少量的TCP包給slave,但可能導致最高40ms的資料延遲。# 如果是no,那可能在複製的時候,會消耗 少量頻寬。# 預設我們是為了低延遲最佳化而設定成no,如果主從之間有很多網路跳躍。那設定成yes吧。repl-disable-tcp-nodelay no # 複製集後台backlog大小# 越大,slave可以丟失的時間就越長。# repl-backlog-size 1mb # 多久釋放backlog,當確認master不再需要slave的時候,多久釋放。0是永遠不釋放。# repl-backlog-ttl 3600 # 當master不可用,Sentinel會根據slave的優先順序選舉一個master。最低的優先順序的slave,當選master。而配置成0,永遠不會被選舉。(必須≥0)。預設是100slave-priority 100 # slave小於幾個,網路lag大於幾秒的時候,master停止接受write請求。預設對slave數目無限制,給0。網路延遲給10s# min-slaves-to-write 3min-slaves-max-lag 10 ################################## 安全 #################################### 多數情況下無需密碼鑒別slave。同時,由於redis處理速度太快,所以爆破速率可達150K/S。10萬/S。所以如果你要設定密碼,必須設定超強的密碼。# requirepass foobared <--這就是密碼 # 命令重新命名# 在一個shared環境裡,可以對危險的命令,比如CONFIG,進行重新命名:也可以用Null 字元串,達到完全屏蔽此命令的目的。# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52# rename-command CONFIG ""# 記錄進AOF或者傳給slave的重新命名操作可能會引發問題哦~。 ################################### 限制 ##################################### 設定最大client串連數。預設10000一萬個。如果redis沒法控制最大檔案數。則給到最低32.# maxclients 10000 # 如果redis用記憶體超過了設定的限制,第一,開始用maxmemory-policy配置的策略往外刪資料,如果配置成了noeviction。所有write都會拒絕,比如set,lpush等。所有讀請求可以接受。# 主要用在把redis用在LRU緩衝,或者用在一個記憶體吃緊又不能刪除的策略上。# 如果你有slave,你應該把最大記憶體別設定的太大,留一些系統記憶體給slave output buffers(如果是noeviction策略,就無需這樣設定了)# maxmemory <bytes> # 記憶體策略。# volatile-lru ->用LRU刪除設定了ttl的key# allkeys-lru ->用LRU刪除任何key# volatile-random ->隨機刪除有ttl的key# allkeys-random ->隨機刪除任何key# volatile-ttl ->刪除即將ttl到期的key# noeviction ->不刪,有write的時候報錯。# 如下操作會返回錯誤# set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort# 預設是# maxmemory-policy volatile-lru # LRU和最小TTL並不是最精確的,但是差不多了也。預設redis每次取3個key然後取最符合刪除策略的刪除。你可以配置這個數。越低,刪除的東西就會越多。比如設定100個,就能刪百分之一。# maxmemory-samples 3 ############################## AOF ################################ 預設redis非同步dump資料到disk。但如果斷電了,那麼就會丟失一部分資料了(根據save的配置)。# AOF提供更好模式。比如用預設的AOF,redis只丟失最近一秒的資料(斷電情況),或者最後一個write操作(redis自身錯誤,os正常)。每個write操作寫一次AOF。# 當AOF檔案太大了,redis會自動重寫一個aof檔案出來。# AOF和RDB持久化可以同時啟用。redis會優先讀AOF恢複資料。# Please check http://redis.io/topics/persistence for more informationappendonly no # 預設檔案名稱appendfilename "appendonly.aof" # fsync()三種:# no:讓OS託管,這樣更快。# always:每次write都刷到log,慢,最安全。# everysec:每秒一次flush。(預設)# http://antirez.com/post/redis-persistence-demystified.html# appendfsync alwaysappendfsync everysec# appendfsync no # 當fsync為always或者everysec,當一個bgsave或者AOF rewrite線程正在耗費大量I/0,redis可能會在fsync上阻塞很久。發生之後就無法fix,即使是另一個線程跑fsync,也會阻塞我們同步的write方法。# 如下方法可以解決這個問題:當bgsave()或bgrewriteaof()在跑,主進程的fsync()就無法調用。也就是當子進程在save,那段時光相當於redis是appendaof no的。也就是有可能會丟失最多30s的log。# 所以如果你有lag問題,把下邊改成yes,否則就用no。yes意思是暫停aof,拒絕主進程的這次fsync。no是redis是排隊的,不會被prevent了,但主進程是阻塞的。no-appendfsync-on-rewrite no # 自動重寫AOF# 當AOF檔案大小到一定比例,就自動隱式調用BGREWRITEAOF# 過程:redis記住最後一次rewrite時aof檔案大小(重啟後沒rewrite的話,就是啟動時AOF檔案的大小),如果現在AOF大小和上次的比例達到特定值就重寫。也要指定最小AOF大小,防止到2倍:1M的時候也重寫。# 把percentage改成0,就是禁用重寫。auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb # AOF檔案可能在尾部是不完整的(上次system關閉有問題,尤其是mount ext4檔案系統時沒有加上data=ordered選項。只會發生在os死時,redis自己死不會不完整)。那redis重啟時load進記憶體的時候就有問題了。# 發生的時候,可以選擇redis啟動報錯,或者load盡量多正常的資料。# 如果aof-load-truncated是yes,會自動發布一個log給用戶端然後load(預設)。如果是no,使用者必須手動redis-check-aof修複AOF檔案才可以。aof-load-truncated yes ################################ LUA SCRIPTING ################################ 如果達到最大時間限制(毫秒),redis會記個log,然後返回error。# 當一個指令碼超過了最大時限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個可以殺沒有調write命令的東西。要是已經調用了write,只能用第二個命令殺。# 設定成0或者負值,時限就無限。lua-time-limit 5000 ################################## SLOW LOG #################################### 線程阻塞不能服務其他請求的時間長度。兩個參數:第一個是時間長度(以微秒為單位!,是毫秒的千分之一。)。第二個是log的size,超過了,就會刪除之前的log。# 1000000是一秒。負值是所有請求都記log!下邊是0.10S。100毫秒。slowlog-log-slower-than 10000 # log長度的設定值是沒限制。但是需要記憶體。slowlog-max-len 128 ################################ LATENCY MONITOR ############################### 用LATENCY列印redis執行個體在跑命令時的耗時圖表。# 只記錄大於等於下邊設定的值的操作。0的話,就是關閉監視。可以動態開啟。直接運行CONFIG SET latency-monitor-threshold <milliseconds>latency-monitor-threshold 0 ############################# Event notification ############################### 可以通知pub/sub用戶端關於key空間的變化。http://redis.io/topics/notifications# 比如如果開著開關。一個client進行了DEL操作在“foo”key上在database0上。兩個訊息將會發布通過 pub/sub# PUBLISH [email protected]__:foo del# PUBLISH [email protected]__:del foo# 大部分人不需要這個功能,並且還需要一定開銷,所以預設關閉。notify-keyspace-events "" ############################### ADVANCED CONFIG ################################ hash結構儲存,小資料量的用數組,大資料量用map(encoding儲存結構資訊)hash-max-ziplist-entries 512hash-max-ziplist-value 64 # list同上。list-max-ziplist-entries 512list-max-ziplist-value 64 # Set在一種情況下會用特殊encoding:整個set是string組成,但是突然需要變成64位帶正負號的整數且是10為根。。不懂。set-max-intset-entries 512 # zset同setzset-max-ziplist-entries 128zset-max-ziplist-value 64 # HyperLogLog 不懂。大於16000完全不可接受!當CPU很頂得住的話,給10000可以。預設給3000.hll-sparse-max-bytes 3000 # Active rehashing 越多次的操作進入了進行中rehash的table,越多的rehash步驟需要執行。如果redis是閒置,那麼rehash操作是永遠沒法停止的,越多的記憶體也被消耗了。# 預設就用yes就行 了如果你想釋放記憶體ASAP。activerehashing yes # client output buffer限制,可以用來強制關閉傳輸緩慢的用戶端(比如redis pub的東西有比較慢的client無法及時sub)# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds># class可以為以下:
#
# normal -> normal clients including MONITOR clients
# slave -> slave clients
# pubsub -> clients subscribed to at least one pubsub channel or pattern# 當hard限制到了會立即被關閉用戶端。如果soft限制到了,會等soft秒。# 比如硬限制是32m,soft是16m,10secs。到32m就立即斷,或者在16m以上停止了10secs。# 設定成0就是關閉。client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60 # redis內部調度(進行關閉timeout的用戶端,刪除到期key等等)頻率,越大則調度頻率越高。設定成100以上會對CPU造成大壓力除非你對線上即時性要求很高。可以在1~500之間。hz 10 # 當child進程在rewrite AOF檔案,如果這個選項是yes,那麼這個file每32MB會寫fsync()。這個是保證增量寫硬碟而防止寫硬碟時I/O突增。aof-rewrite-incremental-fsync yes
redis.conf 配置 詳解 中文 2.8