Redis内存空间简单分析
背景
最近发现项目中用的 redis
内存消耗很大(但是印象中却以为没有这么多的key的内存消耗才对呀?),使用 info
命令可以看到所有key占用的一些内存大小以及key的数量等等,如下图所示(只截图了memory和keyspace部分):
可以发现, info
命令只能看到总的内存大小以及key的数量等。这些对于分析到底哪些或哪类key占用的内存较大是远远不够的!
工具调研
工欲善其事必先利其器!
在各种google搜索之后,发现有一个工具貌似是可以的: redis-rdb-tools 。
于是分头行动,
- 让运维将线上rdb快照文件用scp拷贝到一台测试机上(毕竟在线上机器上操作是不太安全的)
- 我需要用最快最干净的方式来安装一下rdb工具,这里选择直接在python docker中装。
分析之路
根据该工具 , 可以将 rdb 快照文件转换为 csv 格式文件:
拿到csv文件后有两种做法,
- 直接用python
pandas
库分块读取csv文件,可以做一些统计、过滤等操作(几乎有与等价于sql的api操作方式。 - 将csv导入到关系型数据库,用sql来操作,比较灵活 。关于数据库选型:在试验过mysql和postgres两款关系型数据库后,感触挺深, mysql单表导入完上面csv中大概3亿多条数据后,查询直接瘫痪!postgres导入数据后依然坚挺(平均一条like 查询十几秒左右,还是可以接受的!)。
just try!
rdb 文件转换为csv
(这里因为是操作的内部的业务数据,有些数据细节不便公开,仅贴出相关重要命令以及一些踩坑后的经验方法等)
# 1. 先运行一个python docker容器(注意将rdb文件挂载进去) docker run -it -v YOUR_PATH/xxx.rdb:/data/xxx.rdb python bash# 2. 安装rdb tools pip install rdbtools python-lzf# 3. 执行rdb 转为csv命令 (此过程根据rdb文件大小时间不定) rdb -c memory /data/xxx.rdb -f memory.csv
上述命令中有些路径和名称注意替换为你自己真实的值。
csv 简单清洗
话说这里也是个坑来着,在往 postgres
数据库导入csv数据时,报了一个大概意思是 “实际的列个数和期待的列个数不匹配”错误。 可能rdb tools在转换的时候某些行的值有点问题,或者其他bug导致。 这里鉴于有异常的数据条数不多,不用太过于深究,直接用 pandas
简单清洗一下即可。
相关python代码如下:
import pandas as pd import numpy as npreader = pd.read_csv('/xxxx/memory.csv', iterator=True,error_bad_lines=False)loop = True chunkSize =10000000 chunks=[]total_bytes=0while loop:try:chunk = reader.get_chunk(chunkSize)chunks.append(chunk)except StopIteration:loop = Falseprint("Iteration is stopped.")df = pd.concat(chunks, ignore_index=True)df.to_csv('/xxx/memory2.csv', sep=',', encoding='utf-8')
大概解释下,这里先读取csv文件,指定选项 error_bad_lines=False
,则pandas会自动忽略有问题的行。接着用分块的方式读完所有内容,最后合并然后写到新文件。
csv导入postgres
此步骤其实理论上非必须的,上文说到其实可以直接用 pandas
操作csv几乎可以完成跟sql类似的分析效果。 但比较还是直接用sql比较方便,还是导到数据库来的实惠。
# 1. 运行postgres docker容器(记得把上面步骤中转换得到的csv文件挂载进去) docker run --name postgres -v /xxx/memory2.csv:/memory.csv -d postgres:9.6# 2. 进入postgres容器内部 psql shell docker exec -it postgres psql -U postgres # 3. 创建临时表 (建议是所有字段是用text,否则导入可能会遇到转型错误,第一个字段index是pandas带进来的,可以导出csv时处理下) postgres=# create table keys_dump( index integer, database text, type text, key text, size_in_bytes text, encoding text, num_elements text, len_largest_element text, expiry text );# 4. 执行导入csv文件命令 postgres=# COPY keys_dump FROM '/memory.csv' WITH csv;
sql分析
现在问题会比较简单了,这里因为key中涉及到一些实际业务值,下面只是简单列举一下比如统计 string
类型的key占用的总内存大小:
select sum(size_in_bytes::int) from keys_dump where type='text';
诸如此类的sql,根据你的实际场景,比如按key中某关键词进行like查询:
select sum(size_in_bytes::int) from keys_dump where type='text' and key like 'xxxx%';
或者来个统计单key大小前10条:
select * from keys_dump order by size_in_bytes::int desc limit 10;
以上sql语句,我自己都试过,在单表3亿多的行数中执行,总时间大概10几到二十几秒左右,整体速度还是让人能接受的,毕竟只是做下离线分析。
欢迎工作一到五年的Java工程师朋友们加入Java架构开发: 855835163
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
Redis内存空间简单分析相关推荐
- 【2020尚硅谷Java大厂面试题第三季 04】Redis 9种数据类型使用场景,分布式锁演变步骤,lua脚本,redis事务,Redisson,Redis内存占用,删除策略,内存淘汰策略,手写LRU
1.安装redis6.0.8 2023 02 02 为:redis-7.0.8.tar.gz 2.redis传统五大数据类型的落地应用 3.知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的 ...
- 内存分析_Redis内存爆炸增长?你需要知道这一套Redis内存分析方法
Redis Redis介绍 NoSQL Redis是当前比较热门的NOSQL数据库之一,和Memcache一样,数据都是缓存在计算机内存中.完全开源免费,遵守BSD协议,是一个高性能的key-valu ...
- JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具
堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...
- golang 编写的在线redis 内存分析工具 rma4go
redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...
- MTK:内存管理机制简单分析
MTK内存管理机制简单分析 1:内存: 内存,在手机里面,是个较为紧缺的资源,特别是在功能机上面.经常在功能机上面产生的内存不足,申请失败的地方比比皆是, 更是屡见不鲜,经常会为了节省内存,会进行代码 ...
- redis 内存分析工具 `rma4go`
redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...
- 一个golang编写的redis内存分析工具rma4go
redis 内存分析工具 rma4go 简介 redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个red ...
- redis 内存分析工具 RMA 使用
RMA 介绍 RMA 是一个控制台工具,用于实时扫描 Redis 密钥空间并按密钥模式聚合内存使用情况统计信息.您可以使用此工具而无需在生产服务器上进行维护.您可以按所有或选定的 Redis 类型进行 ...
- Redis内存分析工具
2019独角兽企业重金招聘Python工程师标准>>> RdbTools是一个由于分析Redis dump.rdb文件的工具,有以下功能: 生成所有数据库和key的内存分析报告 把d ...
最新文章
- 韩军星:汇报工作的四个层级
- Python自动化开发 - 字符编码、文件和集合
- C++ Primer 5th笔记(8)chapter8 类:IO库-流的状态
- 最强新一代消息系统,没有之一,不接受反驳!
- OpenCV---ROI(region of interest)和泛洪填充
- apicloud - addEventListener 接收不到 sendEvent 的解决方法
- Redis教程:数据对象分析(二)
- 复盘!12 小时清掉 3500 份生财日历
- 有人已经在用AI画色图了...
- 陕西省咸阳市谷歌高清卫星地图下载
- iptables工作原理及iptables命令行使用介绍
- An Apple a day keeps the doctor away
- 小程序从数组中删除指定对象,返回新的长度源代码
- 调查问卷的人口学基本信息该如何设计?
- SAP 业务交易事件BTE(Business Transaction Event)
- 可刷新的 PDB(PDB Refresh)
- 对JSON中的key进行驼峰和下划线格式的相互转换
- 2020年强烈推荐 ,小友必须要看面经的面试题!!
- 地铁译:Spark for python developers ---Spark处理后的数据可视化
- Elasticsearch使用说明(搬砖高人)