1.首先cp一份dump.rdb到另外的目录(一般redis的持久化以rdb的方式存储,在redis配置文件可以找到dump.rdb的存储路径)
2.用rdbtools工具生产内存报告,命令是 rdb -c memory,例子:
sudo rdb -c memory /vagrant/dump.rdb >test.csv
(rdb文件越大,生成时间就長久)
3.报告生成后,结合用linux sort命令排序,根据內存列排序,找出最高的key有哪些。例子:
sudo sort -k4nr -t , test.csv > sort.txt
4.查看sort.txt的结果,一般能得出类似‘my_ranking_list’开头的集合占用最高,排在了前面。若要查看类似‘my_ranking_list’开头的总共占用了多少内存,可以用命令:
sudo cat sort.txt | grep ‘my_ranking_list’ | awk -F ',' '{sum += $4};END {print sum}'
5.我们得知了my_ranking_list这样的集合占用最多内存,而且很可能是业务已经不再需要,但是长期在内存中没清理的,我们可以删除了这些集合,可以用模糊匹配key来删除,命令如下:
redis-cli -h 127.0.0.1 -p 6379 keys 'my_ranking_list*' | xargs redis-cli -h 127.0.0.1 -p 6379 del
6.暂时清理了一下无用和占用大的key后,redis写功能暂时恢复,但是还需对其进行优化和整理,例如定期清理一些无用的数据等
PS:在这里分享一个和redis无关的小功能,就是php的错误级别日志功能。一般我们在生产环境,设置的错误级别都是error_reporting(0)。但是这样很不方便我们去查问题,所以我们可以用以下这个来记录正常的报错在日志中,而且不展示在用户的页面:
error_reporting(E_ALL & ~E_NOTICE); ini_set('display_errors','0'); ini_set('log_errors','1'); ini_set('error_log', dirname(__DIR__).'/log/php_errors/'.date('Ymd').'.log');
这样有利于快速知道问题产生的错误报告,还有没事的时候可以看看日志有哪些地方是可以优化的