Redis集群設(shè)置maxmemory參數(shù)的實(shí)現(xiàn)
在 Redis 集群中設(shè)置內(nèi)存限制需要為每個節(jié)點(diǎn)單獨(dú)配置 maxmemory 參數(shù)。以下是詳細(xì)的操作指南:
設(shè)置步驟
1. 連接到每個集群節(jié)點(diǎn)
# 獲取所有集群節(jié)點(diǎn)信息 redis-cli -c CLUSTER NODES # 示例輸出: d1861060fe6a534d42d8a19aeb36600e18785e04 127.0.0.1:7001@17001 master - 0 1620000000000 1 connected 0-5460 289279eb7dbfa1b2d5e7e9c3e8d4f5a6b7c8d9e0 127.0.0.1:7002@17002 master - 0 1620000000000 2 connected 5461-10922
2. 為每個節(jié)點(diǎn)設(shè)置 maxmemory
# 連接到第一個節(jié)點(diǎn) redis-cli -h 127.0.0.1 -p 7001 # 設(shè)置 2GB 內(nèi)存限制 127.0.0.1:7001> CONFIG SET maxmemory 2gb OK # 設(shè)置淘汰策略(推薦 allkeys-lru) 127.0.0.1:7001> CONFIG SET maxmemory-policy allkeys-lru OK # 驗(yàn)證設(shè)置 127.0.0.1:7001> CONFIG GET maxmemory 1) "maxmemory" 2) "2147483648" # 對其他節(jié)點(diǎn)重復(fù)相同操作
3. 修改配置文件(永久生效)
在每個節(jié)點(diǎn)的 redis.conf 文件中添加:
# 設(shè)置最大內(nèi)存為 2GB maxmemory 2gb # 設(shè)置內(nèi)存淘汰策略 maxmemory-policy allkeys-lru # 集群模式特定配置 cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes.conf
4. 批量設(shè)置腳本
#!/bin/bash
# 節(jié)點(diǎn)列表
NODES=(
"127.0.0.1:7001"
"127.0.0.1:7002"
"127.0.0.1:7003"
"127.0.0.1:7004"
"127.0.0.1:7005"
"127.0.0.1:7006"
)
MEMORY_LIMIT="2gb" # 內(nèi)存限制
POLICY="allkeys-lru" # 淘汰策略
for node in "${NODES[@]}"; do
ip=${node%:*}
port=${node#*:}
echo "Configuring $ip:$port"
redis-cli -h $ip -p $port CONFIG SET maxmemory $MEMORY_LIMIT
redis-cli -h $ip -p $port CONFIG SET maxmemory-policy $POLICY
redis-cli -h $ip -p $port CONFIG REWRITE
# 驗(yàn)證配置
redis-cli -h $ip -p $port CONFIG GET maxmemory
redis-cli -h $ip -p $port CONFIG GET maxmemory-policy
done集群內(nèi)存管理最佳實(shí)踐
1. 內(nèi)存分配策略
| 節(jié)點(diǎn)類型 | 推薦內(nèi)存比例 | 說明 |
|---|---|---|
| 主節(jié)點(diǎn) | 70-80% 系統(tǒng)內(nèi)存 | 存儲實(shí)際數(shù)據(jù) |
| 從節(jié)點(diǎn) | 等同主節(jié)點(diǎn) | 保證故障轉(zhuǎn)移能力 |
| 集群管理節(jié)點(diǎn) | 1-2GB | 運(yùn)行集群管理進(jìn)程 |
2. 監(jiān)控關(guān)鍵指標(biāo)
# 查看集群內(nèi)存使用概覽 redis-cli -c --cluster check 127.0.0.1:7001 # 檢查單個節(jié)點(diǎn)內(nèi)存 redis-cli -h 127.0.0.1 -p 7001 INFO memory
關(guān)鍵指標(biāo):
- used_memory_human:當(dāng)前使用內(nèi)存
- maxmemory_human:配置的最大內(nèi)存
- mem_fragmentation_ratio:內(nèi)存碎片率
- evicted_keys:因內(nèi)存不足被淘汰的鍵數(shù)量
3. 內(nèi)存優(yōu)化技巧
使用 Hash 分片:
# 大鍵分片示例 HSET user:1000 profile:basic "name,age" HSET user:1000 profile:contact "email,phone"
啟用內(nèi)存壓縮:
# redis.conf hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2
定期執(zhí)行內(nèi)存整理:
# Redis 4.0+ 內(nèi)存碎片整理 redis-cli -h 127.0.0.1 -p 7001 MEMORY PURGE
4. 集群擴(kuò)容策略
當(dāng)內(nèi)存使用超過 80% 時考慮擴(kuò)容:
# 添加新節(jié)點(diǎn) redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 # 遷移槽位 redis-cli --cluster reshard 127.0.0.1:7001
高級配置
1. 不同節(jié)點(diǎn)設(shè)置不同內(nèi)存限制
# 高負(fù)載節(jié)點(diǎn)設(shè)置更大內(nèi)存 redis-cli -h 127.0.0.1 -p 7001 CONFIG SET maxmemory 4gb # 低負(fù)載節(jié)點(diǎn)設(shè)置較小內(nèi)存 redis-cli -h 127.0.0.1 -p 7002 CONFIG SET maxmemory 1gb
2. 動態(tài)調(diào)整策略
#!/bin/bash
# 自動調(diào)整內(nèi)存腳本
THRESHOLD=90 # 內(nèi)存使用閾值%
for node in "${NODES[@]}"; do
ip=${node%:*}
port=${node#*:}
# 獲取內(nèi)存使用率
usage=$(redis-cli -h $ip -p $port INFO memory | grep -oP 'mem_allocated_percent:\K\d+')
if [ $usage -gt $THRESHOLD ]; then
# 增加 10% 內(nèi)存
current_mem=$(redis-cli -h $ip -p $port CONFIG GET maxmemory | tail -1)
new_mem=$((current_mem * 11 / 10))
redis-cli -h $ip -p $port CONFIG SET maxmemory $new_mem
echo "Increased memory on $ip:$port to $new_mem"
fi
done3. 使用 Redis 模塊優(yōu)化內(nèi)存
# 加載內(nèi)存優(yōu)化模塊 loadmodule /path/to/redisbloom.so loadmodule /path/to/redisearch.so # 使用 Bloom 過濾器 BF.RESERVE users 0.01 1000000
故障排除
常見問題及解決方案
| 問題 | 癥狀 | 解決方案 |
|---|---|---|
| 內(nèi)存不足 | OOM command not allowed 錯誤 | 增加 maxmemory 或優(yōu)化數(shù)據(jù)結(jié)構(gòu) |
| 高內(nèi)存碎片 | mem_fragmentation_ratio > 1.5 | 執(zhí)行 MEMORY PURGE 或重啟節(jié)點(diǎn) |
| 淘汰率過高 | evicted_keys 快速增加 | 調(diào)整淘汰策略或增加內(nèi)存 |
| 槽位不均衡 | 部分節(jié)點(diǎn)內(nèi)存使用率高 | 重新分配槽位 redis-cli --cluster rebalance |
診斷命令
# 查找內(nèi)存消耗大的鍵 redis-cli -h 127.0.0.1 -p 7001 --bigkeys # 內(nèi)存分析 redis-cli -h 127.0.0.1 -p 7001 MEMORY STATS # 監(jiān)控淘汰事件 redis-cli -h 127.0.0.1 -p 7001 MONITOR | grep evicted
生產(chǎn)環(huán)境建議
監(jiān)控系統(tǒng):
使用 Prometheus + Grafana 監(jiān)控集群內(nèi)存使用
設(shè)置警報(bào)規(guī)則(內(nèi)存 > 85% 時報(bào)警)
備份策略:
# 定期備份集群配置 redis-cli CLUSTER NODES > cluster-backup-$(date +%F).txt
安全配置:
# redis.conf rename-command CONFIG "REDISCONFIG" requirepass "strongpassword" masterauth "replicationpassword"
滾動重啟:
# 安全重啟集群節(jié)點(diǎn) for port in {7001..7006}; do redis-cli -h 127.0.0.1 -p $port CLUSTER FAILOVER TAKEOVER redis-cli -h 127.0.0.1 -p $port shutdown sleep 5 redis-server /path/to/redis-$port.conf sleep 10 done
配置示例文件
redis-cluster-node.conf:
# 基本配置 port 7001 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 # 內(nèi)存管理 maxmemory 4gb maxmemory-policy allkeys-lru # 持久化 appendonly yes appendfilename "appendonly.aof" aof-rewrite-incremental-fsync yes # 安全 requirepass "your_strong_password" masterauth "replication_password" # 優(yōu)化 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 activerehashing yes
總結(jié)
在 Redis 集群中設(shè)置 maxmemory 的關(guān)鍵點(diǎn):
- 單獨(dú)配置:每個節(jié)點(diǎn)需要單獨(dú)設(shè)置內(nèi)存限制
- 統(tǒng)一策略:建議所有節(jié)點(diǎn)使用相同的淘汰策略
- 動態(tài)調(diào)整:根據(jù)負(fù)載情況動態(tài)調(diào)整內(nèi)存限制
- 監(jiān)控預(yù)警:實(shí)時監(jiān)控內(nèi)存使用,設(shè)置預(yù)警閾值
- 定期優(yōu)化:使用內(nèi)存整理和數(shù)據(jù)結(jié)構(gòu)優(yōu)化減少碎片
- 容量規(guī)劃:當(dāng)內(nèi)存使用超過 80% 時考慮擴(kuò)容
通過合理配置 maxmemory 和淘汰策略,可以確保 Redis 集群在高負(fù)載下穩(wěn)定運(yùn)行,防止內(nèi)存溢出導(dǎo)致的系統(tǒng)崩潰。同時結(jié)合監(jiān)控和自動化工具,可以實(shí)現(xiàn)內(nèi)存使用的動態(tài)管理和優(yōu)化。
到此這篇關(guān)于Redis集群設(shè)置maxmemory參數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis 設(shè)置maxmemory參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis為什么默認(rèn)有16個數(shù)據(jù)庫問題
這篇文章主要介紹了Redis為什么默認(rèn)有16個數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
基于Redis位圖實(shí)現(xiàn)系統(tǒng)用戶登錄統(tǒng)計(jì)
這篇文章主要介紹了基于Redis位圖實(shí)現(xiàn)系統(tǒng)用戶登錄統(tǒng)計(jì),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Redis實(shí)現(xiàn)集群搭建+集群讀寫的示例
本文介紹了Redis集群的搭建和讀寫操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
基于Redis實(shí)現(xiàn)登錄功能思路詳解(手機(jī)號+驗(yàn)證碼)
本文介紹了使用手機(jī)號和驗(yàn)證碼登錄的方式,驗(yàn)證碼通過控制臺輸出,重點(diǎn)解釋了UserServiceImpl實(shí)現(xiàn)類的結(jié)構(gòu),包括sendCode、login和createUserWithPhone方法,還介紹了攔截器框架,包括preHandle和攔截器鏈的配置,感興趣的朋友跟隨小編一起看看吧2026-01-01
小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解
這篇文章主要為大家介紹了小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
關(guān)于redis可視化工具讀取數(shù)據(jù)亂碼問題
大家來聊一聊在日常操作redis時用的是什么工具,redis提供的一些命令你都了解了嗎,今天通過本文給大家介紹redis可視化工具讀取數(shù)據(jù)亂碼問題,感興趣的朋友跟隨小編一起看看吧2021-07-07

