现象
生产某集群各节点已使用内存比较大,在清理了大量业务无用数据后,节点已使用内存却未下降。
排查与分析
通过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服务端流入流量。