Redis配置文件之————redis.conf配置及說明

基本設置


 

1. 備釋
當配置中需要配置內存大小時,可以使用 1k, 5GB, 4M 等類似的格式,其轉換方式如下(不區分大小寫):
1k =< 1000 bytes
1kb =< 1024 bytes
1m =< 1000000 bytes
1mb =< 1024*1024 bytes
1g =< 1000000000 bytes
1gb =< 1024*1024*1024 bytes


2. daemonize no
默認情況下,redis不是在後臺運行的,如果需要在後臺運行,把該項的值更改爲yes


3. pidfile /var/run/redis.pid
當redis在後臺運行的時候,Redis默認會把pid文件放在/var/run/redis.pid,你可以配置到其他地址。當運行多個redis
服務時,需要指定不同的pid文件和端口。


4. port 6379
指定redis運行的端口

5. bind 127.0.0.1
翻看網上的文章,此處多翻譯爲“指定redis只接收來自於該IP地址的請求,如果不進行設置,那麼將處理所有請求,在
生產環境中最好設置該項”。這種解釋會totally搞糊塗初學者,甚至是錯誤的。該處的英文原文爲

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
# bind 127.0.0.1

該處說明bind的是interface,也就是說是網絡接口。服務器可以有一個網絡接口(通俗的說網卡),或者多個。打個比方
說機器上有兩個網卡,分別爲192.168.205.5 和192.168.205.6,如果bind 192.168.205.5,那麼只有該網卡地址接受外
部請求,如果不綁定,則兩個網卡口都接受請求。

 

6. timeout 0
設置客戶端連接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼server端關閉該連接。0爲關
閉該設置。


7. tcp-keepalive 0
指定TCP連接是否爲長連接,”偵探”信號由server端維護,長連接將會額外的增加server端的開支
默認爲0.表示禁用,非0值表示開啓”長連接” ;”偵探”信號的發送間隔將有linux系統決定
在多次”偵探”後,如果對等端仍不回覆,將會關閉連接,否則連接將會被保持開啓.
client端socket也可以通過配置keepalive選項,開啓”長連接”.

8. loglevel notice
server日誌級別,合法值:debug,verbose,notice,warning 默認爲notice
debug適合開發環境,客戶端操作信息都會輸出日誌
verbose輸出一些相對有用的信息,目前效果不明
notice適合生產環境
warning異常信息


9. logfile
指定Redis日誌記錄方式,默認值爲stdout,表示打印在命令行終端的窗口上,也可設爲/dev/null屏蔽日誌

10. databases 16
設定redis所允許的最大”db簇”(可以理解爲數據庫)的個數,默認爲16個簇.
客戶端可以通過”select”指令指定需要使用的”db簇”索引號,默認爲0.
redis的頂層數據結構中,所有K-V都潛在的包括了”db簇”索引號,任何一個key都將隸屬於一個”db”.
任何對數據的檢索,只會覆蓋指定的”db”;例如數據被插入到”db 10″中,那麼在”db 1″中去get,將會返回null.
對數據歸類到不同的db簇中,可以幫助我們實現一些特定的需求,比如根據不同客戶端連接,來指定不同的db索引號.

11. maxclients 128
限制同時連接的客戶數量。
當連接數超過這個值時,redis 將不再接收其他連接請求,客戶端嘗試連接時將收到 error 信息

設置爲2時候的會顯示一下錯誤
Error: Connection reset by peer

12. maxmemory <bytes>
設置redis能夠使用的最大內存。
達到最大內存設置後,Redis會先嚐試清除已到期或即將到期的Key(設置過expire信息的key)
在刪除時,按照過期時間進行刪除,最早將要被過期的key將最先被刪除
如果已到期或即將到期的key刪光,仍進行set操作,那麼將返回錯誤
此時redis將不再接收寫請求,只接收get請求。
maxmemory的設置比較適合於把redis當作於類似memcached 的緩存來使用

 

13. maxmemory-policy
當內存達到最大值的時候Redis會選擇刪除哪些數據?有五種方式可供選擇
##
volatile-lru -> 利用LRU算法移除設置過過期時間的key (LRU:最近使用 Least Recently Used )
# allkeys-lru -> 利用LRU算法移除任何key
# volatile-random -> 移除設置過過期時間的隨機key
# allkeys->random -> remove a random key, any key
# volatile-ttl -> 移除即將過期的key(minor TTL)
# noeviction -> 不移除任何可以,只是返回一個寫錯誤
##
注意:對於上面的策略,如果沒有合適的key可以移除,當寫的時候Redis會返回一個錯誤
##
寫命令包括: 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

 

14. syslog-enabled no
'syslog-enabled'設置爲yes會把日誌輸出到系統日誌,默認是no

 

15. syslog-ident redis
指定syslog的標示符,如果'syslog-enabled'是no,則這個選項無效。


16. syslog-facility local0
指定syslog 設備(facility), 必須是USER或者LOCAL0到LOCAL7.

 

SLOWLOG


 

1. slowlog-log-slower-than 10000
Redis slow log用來記錄超過指定執行時間的查詢。執行時間不包括I/O計算比如連接客戶端,返回結果等,只是命令執
行時間
可以通過兩個參數設置slow log:一個是告訴Redis執行超過多少時間被記錄的參數slowlog-log-slower-than(毫秒),另
一個是slow log 的長度。當一個新命令被記錄的時候最早的命令將被從隊列中移除
負數則關閉slow log,0則會導致每個命令都被記錄


2. slowlog-max-len
對日誌長度沒有限制,只是要注意它會消耗內存
可以通過 SLOWLOG RESET 回收被慢日誌消耗的內存

 

Snapshotting


1. save
save ,用來描述”在多少秒期間至少多少個變更操作”觸發snapshot
snapshot最終將生成新的dump.rdb文件
save “”用來禁用snapshot功能
例如save 300 1表示5分鐘內至少一個key變更,觸發snapshot


2. rdbcompression yes
是否啓用rdb文件壓縮手段,默認爲yes.
壓縮可能需要額外的cpu開支,不過這能夠有效的減小rdb文件的大小,有利於存儲/備份/傳輸/數據恢復.


3. rdbchecksum yes
是否對rdb文件使用CRC64校驗和,默認爲”yes”,那麼每個rdb文件內容的末尾都會追加CRC校驗和.
對於其他第三方校驗工具,可以很方便的檢測文件的完整性

 

 

4. dbfilename dump.rdb
鏡像備份文件的文件名

# The filename where to dump the DB
dbfilename dump.rdb

實際存儲文件名:

www@iZ23s8agtagZ:/var/lib/redis$ ls
dump.rdb


5. dir ./
指定rdb/AOF文件的目錄位置,只能爲文件夾不能爲文件

# Note that you must specify a directory here, not a file name.
dir /var/lib/redis

文件位置以及大小:

www@iZ23s8agtagZ:/var/lib/redis$ ls -s
total 11320
11320 dump.rd

 

AOF


 

1. appendonly no
#默認情況下,Redis會異步的把數據保存到硬盤。如果你的應用場景允許因爲系統崩潰等極端情況而導致最新數據丟失#
的話,那這種做法已經很ok了。否則你應該打開‘append only’模式,開啓這種模式後,Redis會在#appendonly.aof
文件中添加每一個寫操作,這個文件會在Redis啓動時被讀取來在內存中重新構建數據集。
#注意:如果你需要,你可以同時開啓‘append only’模式和異步dumps模式(你需要註釋掉上面的‘save’表達式
來禁#止dumps),這種情況下,Redis重建數據集時會優先使用appendonly.aof而忽略dump.rdb


2. appendfilename appendonly.aof
AOF文件名稱 (默認: "appendonly.aof")


3. appendfsync everysec
調用fsync()函數通知操作系統立刻向硬盤寫數據
# Redis支持三種同步AOF文件的策略:
#
# no:不fsync, 只是通知OS可以flush數據了,具體是否flush取決於OS.性能更好.
# always: 每次寫入append only 日誌文件後都會fsync . 性能差,但很安全.
# everysec: 沒間隔1秒進行一次fsync. 折中.
#
# 默認是"everysec",按照速度和安全折中這是最好的。
# 如果想讓Redis能更高效的運行,你也可以設置爲"no",讓操作系統決定什麼時候去執行
# 或者相反想讓數據更安全你也可以設置爲"always"
#
# 如果不確定就用 "everysec".


4. no-appendfsync-on-rewrite no
# AOF策略設置爲always或者everysec時,後臺處理進程(後臺保存或者AOF日誌重寫)會執行大量的I/O操作
# 在某些Linux配置中會阻止過長的fsync()請求。注意現在沒有任何修復,即使fsync在另外一個線程進行處理
#
# 爲了減緩這個問題,可以設置下面這個參數no-appendfsync-on-rewrite

5. auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# append only 文件的自動重寫
# 當AOF 日誌文件即將增長到指定百分比時,Redis可以通過調用BGREWRITEAOF 來自動重寫append only文件。
# 它是這麼幹的:Redis會記住最近一次重寫後的AOF 文件size。然後它會把這個size與當前size進行比較,如果當前size
比指定的百分比大,就會觸發重寫。同樣,你需要指定AOF文件被重寫的最小size,這對避免雖然百分比達到了, 但是實
際上文件size還是很小(這種情況沒有必要重寫)卻導致AOF文件重寫的情況很有用。
# auto-aof-rewrite-percentage 設置爲 0 可以關閉AOF重寫功能

 

高級配置


 

1. hash-max-zipmap-entries 512
hash-max-zipmap-value 64
redis 2.0後引入了 hash 數據結構。
當hash中包含超過指定元素個數並且最大的元素沒有超過臨界時,
# hash將以一種特殊的編碼方式(大大減少內存使用)來存儲,這裏可以設置這兩個臨界值
# Redis Hash對應Value內部實際就是一個HashMap,實際這裏會有2種不同實現,
# 這個Hash的成員比較少時Redis爲了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結
構,對應的value redisObject的encoding爲zipmap,
# 當成員數量增大時會自動轉成真正的HashMap,此時encoding爲ht。


2. activerehashing yes
是否重置Hash表
設置成yes後redis將每100毫秒使用1毫秒CPU時間來對redis的hash表重新hash,可降低內存的使用
當使用場景有較爲嚴格的實時性需求,不能接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置爲no。
如果沒有這麼嚴格的實時性要求,可以設置爲 yes,以便能夠儘可能快的釋放內存


3. list-max-ziplist-entries 512
list-max-ziplist-value 64
list 數據類型多少節點以下會採用去指針的緊湊存儲格式。
list 數據類型節點值大小小於多少字節會採用緊湊存儲格式。


4. set-max-intset-entries 512
set數據類型內部數據如果全部是數值型,且包含多少節點以下會採用緊湊格式存儲。


5. zset-max-ziplist-entries 128
zset-max-ziplist-value 64
zsort 數據類型多少節點以下會採用去指針的緊湊存儲格式。
zsort 數據類型節點值大小小於多少字節會採用緊湊存儲格式。

 

Replication(複製)


 

1. slaveof
將當前server做爲slave,併爲其指定master信息.
slaveof <masterip> <masterport> 當本機爲從服務時,設置主服務的IP及端口

# slaveof <masterip> <masterport>
slaveof 11.41.8.209 63789


2. masterauth
以認證的方式連接到master。 如果master中使用了”密碼保護”,slave必須交付正確的授權密碼,才能連接成功。
“requirepass”配置項指定了當前server的密碼。
此配置項中值需要和master機器的”requirepass”保持一致

 masterauth tinywanredis


3. slave-serve-stale-data yes
如果當前server是slave,那麼當slave與master失去通訊時,是否繼續爲客戶端提供服務,”yes”表示繼續,”no”表示終止.
在”yes”情況下,slave繼續向客戶端提供只讀服務,有可能此時的數據已經過期.
在”no”情況下,任何向此server發送的數據請求服務(包括客戶端和此server的slave)都將被告知”error”,但 INFO 和SLAVEOF
命令除外。

# When a slave loses its connection with the master, or when the replication
# is still in progress, the slave can act in two different ways:slave-serve-stale-data yes

 

VM(虛擬內存)


 

1. vm-enabled no

是否開啓虛擬內存支持。
redis 是一個內存數據庫,當內存滿時,無法接收新的寫請求,所以在redis2.0後,提供了虛擬內存的支持
但需要注意的,redis 所有的key都會放在內存中,在內存不夠時,只把value 值放入交換區
雖使用虛擬內存,但性能基本不受影響,需要注意的是要把vm-max-memory設置到足夠來放下所有的key


2. vm-swap-file /tmp/redis.swap
設置虛擬內存的交換文件路徑,不可多個Redis實例共享


3. vm-max-memory 0
設置開啓虛擬內存後,redis將使用的最大物理內存大小。
默認爲0,redis將把他所有能放到交換文件的都放到交換文件中,以儘量少的使用物理內存
即當vm-max-memory設置爲0的時候,其實是所有value都存在於磁盤
在生產環境下,需要根據實際情況設置該值,最好不要使用默認的 0


4. vm-page-size 32
設置虛擬內存的頁大小
如果 value 值比較大,如要在 value 中放置博客、新聞之類的所有文章內容,就設大一點


5. vm-pages 134217728
設置交換文件的總的 page 數量
注意page table信息是放在物理內存中,每8個page 就會佔據RAM中的 1 個 byte
總的虛擬內存大小 = vm-page-size * vm-pages


6. vm-max-threads 4
設置 VM IO 同時使用的線程數量。

 

Security(安全)


 

1. requirepass foobared
當前server的授權密碼
任何客戶端或者slave與此server交互前,需要提交密碼,其他server的masterauth配置和此參數值保持一致
密碼應該足夠複雜(64字節)
需要客戶端在執行任何命令之前指定 AUTH <PASSWORD>

# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.requirepass tinywanredis


2. rename-command
命令重命名.
例如: rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
同樣可以通過把一個命令重命名爲空串來徹底kill掉這個命令,比如:
rename-command CONFIG ""

複製代碼
121.41.88.209:63789[1]> config get *max-*-entries*
1) "hash-max-ziplist-entries"
2) "512"
3) "list-max-ziplist-entries"
4) "512"
5) "set-max-intset-entries"
6) "512"
7) "zset-max-ziplist-entries"
8) "128"
複製代碼

修改爲:

# Example:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

重新獲取:

config get *max-*-entries*
(error) ERR unknown command 'config'

 

Redis官方VM使用建議


 


一般情況下不建議使用虛擬內存,如果有特殊需求,請考慮以下幾種情況:

  • 當key很小而value很大時,使用VM的效果會比較好.因爲這樣節約的內存比較大
  • 當key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,如可將key,value組合成一個新的value
  • 最好使用linux ext3 等對稀疏文件支持比較好的文件系統保存你的swap文件
  • vm-max-threads參數可設置訪問swap文件的線程數,最好不要超過機器的核數;設置爲0則所有對swap文件的操
  • 作都是串行的,可能會造成比較長時間的延遲,但是對數據完整性有很好的保證


redis數據存儲
redis的存儲分爲內存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數對其進行配置。

  • save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將數據同步到數據文件。可多個條件配合,默認配置了三個條件。
  • appendonly yes/no ,appendonly配置,指出是否在每次更新操作後進行日誌記錄,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。因爲redis本身同步數據文件是按上面的save條件來同步的,所以有的數據會在一段時間內只存在於內存中。
  • appendfsync no/always/everysec ,appendfsync配置,no表示等操作系統進行數據緩存同步到磁盤,always表示每次更新操作後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章