現象
生產某集群各節點已使用內存比較大,在清理了大量業務無用數據后,節點已使用內存卻未下降。
排查與分析
通過info memory命令查看,內存碎片率略高,但是對某個主節點新添加的從節點內存使用依然很高,所以排除了內存碎片率的問題。
然后在info memory命令返回數據中,看到 number_of_cached_scripts 這個指標特別高,有987W,也就是說業務使用script load命令在redis服務端緩存了987W個lua腳本,占用了大量內存,因此不管怎么清理數據,內存使用率無法下降。
經過和業務溝通證實,他們未正確理解script load命令導致將每條執行的lua腳本都調用該命令進行了緩存。
調用 SCRIPT FLUSH 命令清除緩存的lua腳本即可。
script load正確使用
會被大量重復使用的lua腳本,尤其並且腳本本身比較大的情況下,應該先使用script load命令將lua腳本在redis服務端進行緩存,然后每次重復執行時,使用evalsha命令,可減少redis服務端流入流量。
