高进波的博客 数据库 redis缓存lua脚本过多导致内存占用很多问题 清理redis lua内存

redis缓存lua脚本过多导致内存占用很多问题 清理redis lua内存

redis缓存lua脚本过多导致内存占用很多问题 清理redis lua内存 post thumbnail image

redis缓存lua脚本过多导致内存占用很多问题 清理redis lua内存

现象

生产某集群各节点已使用内存比较大,在清理了大量业务无用数据后,节点已使用内存却未下降。

排查与分析

通过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服务端流入流量。

redis-cli

SCRIPT FLUSH

EVAL ” 0

Related Post