背景

最近发现项目中用的 redis 内存消耗很大(但是印象中却以为没有这么多的key的内存消耗才对呀?),使用 info 命令可以看到所有key占用的一些内存大小以及key的数量等等,如下图所示(只截图了memory和keyspace部分):

可以发现, info 命令只能看到总的内存大小以及key的数量等。这些对于分析到底哪些或哪类key占用的内存较大是远远不够的!

工具调研

工欲善其事必先利其器!

在各种google搜索之后,发现有一个工具貌似是可以的: redis-rdb-tools 。

于是分头行动,

  1. 让运维将线上rdb快照文件用scp拷贝到一台测试机上(毕竟在线上机器上操作是不太安全的)
  2. 我需要用最快最干净的方式来安装一下rdb工具,这里选择直接在python docker中装。

分析之路

根据该工具 , 可以将 rdb 快照文件转换为 csv 格式文件:

拿到csv文件后有两种做法,

  1. 直接用python pandas 库分块读取csv文件,可以做一些统计、过滤等操作(几乎有与等价于sql的api操作方式。
  2. 将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内存空间简单分析相关推荐

  1. 【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分布式锁的 ...

  2. 内存分析_Redis内存爆炸增长?你需要知道这一套Redis内存分析方法

    Redis Redis介绍 NoSQL Redis是当前比较热门的NOSQL数据库之一,和Memcache一样,数据都是缓存在计算机内存中.完全开源免费,遵守BSD协议,是一个高性能的key-valu ...

  3. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  4. golang 编写的在线redis 内存分析工具 rma4go

    redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...

  5. MTK:内存管理机制简单分析

    MTK内存管理机制简单分析 1:内存: 内存,在手机里面,是个较为紧缺的资源,特别是在功能机上面.经常在功能机上面产生的内存不足,申请失败的地方比比皆是, 更是屡见不鲜,经常会为了节省内存,会进行代码 ...

  6. redis 内存分析工具 `rma4go`

    redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...

  7. 一个golang编写的redis内存分析工具rma4go

    redis 内存分析工具 rma4go 简介 redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个red ...

  8. redis 内存分析工具 RMA 使用

    RMA 介绍 RMA 是一个控制台工具,用于实时扫描 Redis 密钥空间并按密钥模式聚合内存使用情况统计信息.您可以使用此工具而无需在生产服务器上进行维护.您可以按所有或选定的 Redis 类型进行 ...

  9. Redis内存分析工具

    2019独角兽企业重金招聘Python工程师标准>>> RdbTools是一个由于分析Redis dump.rdb文件的工具,有以下功能: 生成所有数据库和key的内存分析报告 把d ...

最新文章

  1. 韩军星:汇报工作的四个层级
  2. Python自动化开发 - 字符编码、文件和集合
  3. C++ Primer 5th笔记(8)chapter8 类:IO库-流的状态
  4. 最强新一代消息系统,没有之一,不接受反驳!
  5. OpenCV---ROI(region of interest)和泛洪填充
  6. apicloud - addEventListener 接收不到 sendEvent 的解决方法
  7. Redis教程:数据对象分析(二)
  8. 复盘!12 小时清掉 3500 份生财日历
  9. 有人已经在用AI画色图了...
  10. 陕西省咸阳市谷歌高清卫星地图下载
  11. iptables工作原理及iptables命令行使用介绍
  12. An Apple a day keeps the doctor away
  13. 小程序从数组中删除指定对象,返回新的长度源代码
  14. 调查问卷的人口学基本信息该如何设计?
  15. SAP 业务交易事件BTE(Business Transaction Event)
  16. 可刷新的 PDB(PDB Refresh)
  17. 对JSON中的key进行驼峰和下划线格式的相互转换
  18. 2020年强烈推荐 ,小友必须要看面经的面试题!!
  19. 地铁译:Spark for python developers ---Spark处理后的数据可视化
  20. Elasticsearch使用说明(搬砖高人)

热门文章

  1. React+Redux技术栈核心要点解析(中篇)
  2. springboot成都大学校园植物网站毕业设计-附源码181557
  3. 图像质量评价数据库TID2013 网盘下载
  4. java中short类型变量
  5. 一生的读书计划——影响中国历史进程的中国名人2
  6. 计算机知识培训感言,关于计算机培训心得体会
  7. 给软件添加注册码【笔记】
  8. java utf-8 转 gbk / gbk 转 utf-8
  9. BIO基本介绍以及使用
  10. linux 压缩减少大小,linux – 为什么gnu parallel chunking会改善gzip的压缩大小?