Redis佔用內存不釋放

Hachibye
3 min readMay 30, 2024

--

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

--

--

Hachibye
Hachibye

Written by Hachibye

字幕組退休勞工 ... DevOps/系統/雲端/資安

No responses yet