How to optimize the problem that Redis takes up memory and does not release it
已知有以下幾種方法:
- 增加主機的硬體資源
- 配置淘汰機制(maxmemory-policy)這個網路上都有文章可參考
#預設值 不刪除任何KEY 內存滿了直接報錯
maxmemory-policy noeviction
- 開啟內存碎片整理
#編輯redis.conf文件
#開啟內存碎片整理
activefrag yes
#設置碎片達到多少時整理
active-defrag-ignore-bytes 200mb
#設置碎片佔比超過多少閾值時整理
active-defrag-threshold-lower 20
- 限制maxmemory
#編輯redic.conf文件
#限制redis最大可使用內存
maxmemory 512mb
- 手動清理已經過期(Expired Keys)的KEY鍵值
Step1:確認內容
#查詢全部key數量
redis-cli -c -h <你的redis主機地址> -p <端口號> -a <密碼> keys '*' | wc -l
> 88
#查詢DB內容數量
redis-cli -c -h <你的redis主機地址> -p <端口號> -a <密碼> dbsize
> (interger) 88
Step2:編輯腳本
#!/bin/bash
#配置端口和密碼
REDIS_PORT=7006
REDIS_PASSWORD="pass.123"
REDIS_HOST="192.168.10.209"
cursor=0
while :; do
result=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD --raw SCAN $cursor)
cursor=$(echo "$result" | head -n 1)
keys=$(echo "$result" | tail -n +2)
#遍歷所有KEY
for key in $keys; do
ttl=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD TTL "$key")
#如果TTL小於0則執行刪除
if [ "$ttl" -lt 0 ]; then
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD DEL "$key"
echo "Deleted expired key: $key"
fi
done
if [ "$cursor" -eq 0 ]; then
break
fi
done
Step3:賦予腳本執行權限
chmod +x delete_expired_keys.sh
Step4:執行腳本
./delete_expired_keys.sh
Step5:確認結果
#查詢全部key數量
redis-cli -c -h <你的redis主機地址> -p <端口號> -a <密碼> keys '*' | wc -l
> 39
#查詢DB內容數量
redis-cli -c -h <你的redis主機地址> -p <端口號> -a <密碼> dbsize
> (interger) 39