当前位置: 首页 > 编程笔记 >

基于redis key占用内存量分析

马宜民
2023-03-14
本文向大家介绍基于redis key占用内存量分析,包括了基于redis key占用内存量分析的使用技巧和注意事项,需要的朋友参考一下

Redis的指令看不出哪一类型的key,占用了多少内存,不好分析redis内存开销大的情况下,各应用程序使用缓存的占比。

借助第3方工具进行分析

1、采用2个工具结合

redis-rdb-tools+sqlite

2、sqlite linux服务器都会自带,安装redis-rdb-tools

使用pip安装 pip install redis-rdb-tools

源码安装

git clone https://github.com/sripathikrishnan/redis-rdb-tools

cd redis-rdb-tools

python setup.py install

如果不成功安装 yum install python-setuptools

3、获取对应redis的rdb文件,使用redis-rdb-tools生成内存快照

rdb -c memory dump.rdb > memory.csv

注意:内存使用量是理论上的近似值,在一般情况下,略低于实际值

4、把数据导入sqlite(mysql数据库实际上都能导入),sqlite语法和mysql基本一致

splite3 test.db
sqlite> create table memory(database int,type varchar(128),key varchar(128),size_in_bytes int,encoding varchar(128),num_elements int,len_largest_element varchar(128),time varchar(128));
sqlite>.mode csv memory
sqlite>.import memory.csv memory

5、查询

查询key个数

sqlite>select count(*) from memory;

查询总的内存占用

sqlite> select sum(size_in_bytes) from memory;

查询内存占用最高的10个key

sqlite>select * from memory order by size_in_bytes desc limit 10;

补充知识:Redis使用量暴增,快速定位有哪些大key在作怪

发现redis使用量突然暴增,于是紧急扩容redis,不能影响服务运行。扩容之后,赶紧查找原因,突破口就是寻找存在哪些大key。

1. 将redis的dump.rdb文件下载到本地(一般redis的持久化文件以rdb的方式存储,在redis配置文件可以找到dump.rdb的存储路径)。

2. 用rdbtools工具生产内存报告,命令是 rdb -c memory,例子:

sudo rdb -c memory /redisfile/dump.rdb >test.csv

注意:rdb文件越大,生成时间越长。

Rdbtools是以python语言开发的。

GITHUP地址:https://github.com/sripathikrishnan/redis-rdb-tools/

3. 内存报告生成后,结合用linux sort命令排序,根据內存列排序,找出最高的key有哪些。例子:

sudo sort -k4nr -t , test.csv > sort.txt

4. 查看前1000个排序最高的数据

awk -F ',' '{print substr($3, 0,18)}' sort.txt | head -1000 | sort -k1 | uniq

5. 查看sort.txt的结果,一般能得出类似‘my_rank_top'开头的集合占用最高,排在了前面。

若要查看类似‘my_rank_top'开头的key总共占用了多少内存,可以用命令:

sudo cat sort.txt | grep ‘my_rank_top' | awk -F ',' '{sum += $4};END {print sum}'

6. 得知了my_rank_top这样的key占用最多内存,而且很可能是业务已经不再需要,但是长期在内存中没清理的,我们可以删除了这些集合。可以用模糊匹配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

另附:在本地启动redis加载dump.rdb文件时,一直load失败。搞了很长时间,终于找到原因:redis配置文件里databases要修改为256,本地默认是16,而产生原始dump.rdb的redis的databases就是25。

以上这篇基于redis key占用内存量分析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 【内存占用】页面主要展示项目运行过程中内存的使用情况,主要包括以下几个部分: 数据汇总 该项主要展示项目运行过程中的 “总内存峰值”、“堆内存峰值”、“GFX内存峰值” 和 “泄露风险”。其中,总内存为Unity引擎所统计的真实物理内存分配,并不包含系统缓存和第三方库的自身分配内存; 堆内存所指的是 Mono 管理和分配的托管堆内存; GFX内存为用于渲染的资源所占用的内存,主要包括纹理资源、网格

  • 问题内容: 我是所有内存管理主题的新手,所以有很多我不了解的事情。 我正在尝试将图像缓存在我的应用程序中,但是我在内存消耗方面遇到了麻烦: 所有的Bitmap Chaching代码都可以从此处复制粘贴:http : //developer.android.com/training/displaying- bitmaps/index.html 我调试了代码,并在Eclipse的DDMS视图中检查了堆

  • Android Studio似乎比其他任何应用程序占用更多内存。Java二进制增加了速度,过一会儿就慢下来了。通常重启android studio可以解决这个问题,但是,我需要每隔几个小时重启一次。在撰写本文时,Android Studio和Java总共占用了大约2.5GB内存。以前觉得eclipse不好:) 我有10GB的RAM,但仍然发现它使用缓慢,有时偶尔会挂起。我想知道其他人是否也面临着同

  • 我正在制作一个应用程序,它在一个UImageView中显示gif,从Parse加载gif。我遇到的问题是,每当我加载一个Gif时,它都会使用大约20 mb的内存,而当我执行segue时,这个内存没有被分配。我从UImageView中删除了图像本身,但它仍然没有释放内存。 这是我用来显示GIF的代码: 这可能是我记忆问题的原因吗?感谢任何帮助!

  • 问题内容: 我有一小段代码每隔五分钟拍摄一次我的桌面的屏幕截图。但是,我对它占用的内存量有些困惑-通常它会爬升到200mb RAM,我敢肯定这是多余的…谁能告诉我a)减少内存占用空间的明智方法或b)它为什么涨 可言 ? 问题答案: 其他答案是正确的:Java将使用允许的尽可能多的内存,这时它将进行垃圾回收。要解决此问题,可以在JVM设置中指定较小的最大堆大小。您可以使用- Xmx设置来执行此操作。

  • 我正在使用框架用iPhone摄像头捕捉视频,我的代码: 在之前,一切都很顺利,内存被限制在3M,但在之后,内存使用量每秒增加0.06M,几分钟后,应用程序会因为内存警告而崩溃。似乎占用了太多内存,并且可能存在内存泄漏问题。 那么如何减少内存使用量呢? iOS版本:7.1.1