本文只涉及 Redis 在 Windows 中的配置(不含集群)
簡單介紹
Redis是一款開源的妇汗、高性能的鍵 - 值存儲(Key - Value store)秫筏。和 Memcached 類似种冬,Redis 常被稱作是一款 Key - Value 內(nèi)存存儲系統(tǒng)(或內(nèi)存數(shù)據(jù)庫)付燥。
同時敷钾,由于它支持豐富的數(shù)據(jù)結(jié)構枝哄,又被稱為一種數(shù)據(jù)結(jié)構服務器(Data Structure Server)。
但是阻荒,Redis 官方并不支持 Windows挠锥,微軟開源團隊 將其移植到了 Windows 中。
在實際生產(chǎn)環(huán)境中侨赡,還是建議將 Redis 部署在 CentOS 中來進行蓖租,畢竟 Redis 全部是通過 API 進行操作,跨平臺訪問是天生的羊壹。
- 配置環(huán)境:Windows 7 Pro x64
Redis 安裝
安裝很簡單蓖宦,直接在上面的 Windows 版中下載 msi,雙擊運行即可安裝(這里的版本是 v3.2.100)油猫。
稍微說明一下:在安裝過程中稠茂,最好把上圖的這個選項勾上,方便在命令行中隨時執(zhí)行相應的指令情妖。
安裝好之后睬关,會這系統(tǒng)服務里面安裝一個 Redis 的節(jié)點服務,并且已經(jīng)啟動了毡证。
接下來电爹,就可以進行操作了。
常規(guī)操作
登錄到 Redis 服務器情竹,在命令行中執(zhí)行以下命令(也可以直接雙擊安裝目錄下的 redis-cli.exe 登錄到默認端口的 Redis 服務器):
// -h:主機 IP
// -p:主機端口
// 如果要登錄集群節(jié)點,還需添加一個參數(shù):-c
redis-cli -h 127.0.0.1 -p 6379
由于在安裝的時候,已經(jīng)將 Redis 的安裝路徑注冊到系統(tǒng) PATH 了秦效,所以雏蛮,在命令行的隨便哪個位置,都可以執(zhí)行 Redis 的指令阱州。
看到如下界面挑秉,就表示登錄成功了:
Redis 安裝好以后,可通過常用的幾個指令進行查看和操作:
-
info
(查看 Redis 服務器的全部信息) -
keys *
(查看當前存儲的所有 key) -
get <keyname>
(查看指定 key 的內(nèi)容) -
del <keyname>
(刪除指定 key 的內(nèi)容) -
set <keyname> <value>
(設置指定 key 的內(nèi)容) -
flushdb
(刪除 當前數(shù)據(jù)庫 中的所有 key) -
flushall
(刪除 所有數(shù)據(jù)庫 中的所有 key)
info
指令:查看 Redis 服務器的全部信息
info
后面還可以跟具體某個部分的信息苔货,只看這一項的具體內(nèi)容犀概,就是上圖中,井號 “#” 后面的內(nèi)容夜惭,比如:
info server // 查看服務器基本信息
info memory // 查看內(nèi)存使用情況
// ……
關于 info
指令的詳細說明姻灶,參見這里(英文)。
關于
info memory
指令的結(jié)果分析
這個指令主要是查看服務器內(nèi)存使用情況的诈茧,在命令行執(zhí)行之后产喉,如下所示:
該指令主要顯示了當前內(nèi)存的占用情況、碎片情況敢会,還有就是內(nèi)存可占用的最大空間以及占用達到最大空間后的處理策略曾沈。
先把這些指標簡單分為兩大類:
- 末尾沒有帶 “_human”:即該節(jié)點的實際數(shù)值
- 末尾帶有 “_human”:即便于人類理解的數(shù)值(自動把實際數(shù)值按 1024 轉(zhuǎn)換而來)
內(nèi)存相關的指標說明:
- used_memory:由 Redis 分配器分配的內(nèi)存總量,以字節(jié)(byte)為單位鸥昏。
- used_memory_rss:從操作系統(tǒng)的角度塞俱,返回 Redis 已分配的內(nèi)存總量(俗稱:常駐集大小。rss 是 Resident Set Size 的意思)吏垮。這個值和 top障涯、ps 等命令的輸出一致。
- used_memory_peak:Redis 的內(nèi)存消耗峰值惫皱,以字節(jié)(byte)為單位像樊。
- total_system_memory:Redis 所在的服務器實際內(nèi)存大小,以字節(jié)(byte)為單位旅敷。
- used_memory_lua:Lua 引擎所使用的內(nèi)存大小生棍,以字節(jié)(byte)為單位。
- maxmemory:Redis 最大可用的內(nèi)存空間媳谁,以字節(jié)(byte)為單位涂滴。
- maxmemory_policy:當數(shù)據(jù)占滿最大可用空間時,需要執(zhí)行的過期策略(見后:過期策略種類解釋)
- mem_allocator:在編譯時指定的晴音,Redis 所使用的內(nèi)存分配器柔纵。可以是 libc锤躁、jemalloc 或 tcmalloc搁料。
-
mem_fragmentation_ratio:used_memory_rss 和 used_memory 之間的比率(詳見:特別說明)。
特別說明:
- 在理想情況下,used_memory_rss 的值應該只比 used_memory 稍微高一點(比率不超過 1.5)郭计。
- 當 rss > used 時霸琴,且兩者的值相差較大時,表示存在(內(nèi)部或外部的)內(nèi)存碎片(內(nèi)存碎片的比率可以通過 mem_fragmentation_ratio 的值看出)昭伸。
- 當 used > rss 時梧乘,表示 Redis 的部分內(nèi)存被操作系統(tǒng)換出到交換空間內(nèi)了。在這種情況下庐杨,操作可能會產(chǎn)生明顯的延遲选调。
當 Redis 釋放內(nèi)存時,分配器會(也可能不會)將內(nèi)存返還給操作系統(tǒng)灵份。
如果 Redis 釋放了內(nèi)存仁堪,卻沒有將內(nèi)存返還給操作系統(tǒng),那么 used_memory 的值就可能和操作系統(tǒng)顯示的 Redis 內(nèi)存占用的值不一致各吨。
查看 used_memory_peak 的值枝笨,即可以驗證這種情況是否發(fā)生。
內(nèi)存碎片是怎么產(chǎn)生的呢揭蜒?簡單來說:Redis 需要一個連續(xù)的內(nèi)存空間來存儲 1G 的數(shù)據(jù)横浑,但是當前內(nèi)存已經(jīng)沒有 1G 連續(xù)的空間了,這樣屉更,操作系統(tǒng)不得不將多個不連續(xù)的空間組合起來提供 1G 的大小徙融,這就導致了內(nèi)存碎片的產(chǎn)生。
*mem_fragmentation_ratio 稍大于 1 是合理的瑰谜。這個值表示內(nèi)存碎片率比較低欺冀,也說明 Redis 沒有發(fā)生內(nèi)存交換。
- 如果該值超過 1.5萨脑,那就說明 Redis 消耗了實際需要物理內(nèi)存的150%隐轩,其中 50% 是內(nèi)存碎片。
- 如果該值低于 1 的話(但 0.95 以上都算正常)渤早,說明Redis內(nèi)存分配超出了物理內(nèi)存职车,操作系統(tǒng)正在進行內(nèi)存交換。而內(nèi)存交換會引起非常明顯的響應延遲鹊杖。*
一般來說悴灵,碰到這樣的情況,建議從三個方面進行優(yōu)化:
- 重啟 Redis 服務器:記得在重啟之前骂蓖,用 redis-cli 工具先執(zhí)行 shutdown save 指令积瞒,將數(shù)據(jù)持久化到硬盤上,待重啟之后登下,再加載回內(nèi)存茫孔,避免數(shù)據(jù)丟失叮喳。
- 限制內(nèi)存交換
- 修改內(nèi)存分配器
更多優(yōu)化方法,可參考這里
在運行過程中
- 獲取配置的指令:
config get "<info 中的 key>"
- 設置配置的指令:
config set "<info 中的 key>" "<值>"
比如:在 Redis 運行中缰贝,設置最大可用內(nèi)存空間嘲更,輸入以下命令:
config set "maxmemory" "300mb"
一般來說,如果設置了具體的最大可用內(nèi)存空間揩瞪,一定要關注過期策略:maxmemory-policy
。
過期策略種類解釋(后有名詞解釋):
- volatile-lru:對 “過期集合” 中的數(shù)據(jù)采取 LRU 算法篓冲。將(已經(jīng)過期 ÷ LRU)的數(shù)據(jù)優(yōu)先移除李破。如果 “過期集合” 中的數(shù)據(jù)全部移除了,仍不能滿足內(nèi)存需求壹将,則將 OOM嗤攻。
- allkeys-lru:對所有的數(shù)據(jù),采用 LRU 算法诽俯。
- volatile-random:對 “過期集合” 中的數(shù)據(jù)采取 “隨機選取” 算法妇菱,并移除選中的 K - V,直到 “內(nèi)存足夠” 為止暴区。如果 “過期集合” 中的數(shù)據(jù)全部移除了闯团,仍不能滿足內(nèi)存需求,將 OOM仙粱。
- allkeys-random:對所有的數(shù)據(jù)房交,采取 “隨機選取” 算法,并移除選中的 K - V伐割,直到 “內(nèi)存足夠” 為止候味。
- volatile-ttl:對 “過期集合” 中的數(shù)據(jù)采取 TTL 算法,移除即將過期的數(shù)據(jù)隔心。
- noeviction:不做任何干擾操作白群,直接返回 OOM 異常。
說明:
1. 過期集合:如果對 key 使用expire
指令指定了過期時間硬霍,那么帜慢,此 key 將會被添加到 “過期集合” 中。
2. LRU:Least Recently Used须尚,近期最少使用崖堤,詳見百科
3. TTL:Time To Live,最小存活時間耐床,詳見百科
4. OOM:Out Of Memory密幔,Killer 會干掉 Redis 進程,俗稱:死機撩轰。
5. 以上全部內(nèi)容的官方說明(英文)
至此胯甩,在 Windows 下配置 Redis 就差不多結(jié)束了昧廷。
- 如需配置 Redis 集群,請看這里
- 如需使用 C#(StackExchange.Redis)進行開發(fā)偎箫,請看這里