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 toolspip 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 np

reader = pd.read_csv('/xxxx/memory.csv', iterator=True,error_bad_lines=False)

loop = True

chunkSize =10000000

chunks=[]

total_bytes=0

while loop:

    try:

        chunk = reader.get_chunk(chunkSize)

        chunks.append(chunk)

    except StopIteration:

        loop = False

        print("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等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • Redis 内存分析方法 背景 线上经常遇到用户想知道自己 Redis 实例中数据的内存分布情况。为了不影响线上实...
    Jack0111阅读 1,402评论 1 3
  • 刚上初中时遇到一位语文老师,眼睛里有光的短发女老师,第一次知道有种作文叫主题作文。一种不用固定标题,在一个主题里天...
    薄情的世界深情地活着阅读 4,238评论 3 6
  • 引子 张先,北宋著名词人,自诩“三影郎中”,一生富足长寿,诗酒风流,工书,善画,精词,著有《张子野词》,存词180...
    剑行天下阅读 2,865评论 9 13
  • 文/Nico -01- 大概八年前吧,有一个关系不错的高中女同学。 仍然记得见她最后一面的时候,她高昂着头,说着宽...
    Nico尼可阅读 838评论 3 20