如何检测出redis的哪些key在消耗内存

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 如何检测出redis的哪些key在消耗内存

今天发现测试环境Redis进程被OOM killer了,所以,直觉就是优先找出消耗内存的罪魁祸首key。

redis-rdb-tools 是专门用来干这活的,我们先来了解下:

一、rdbtools工具介绍

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

redis-rdb-tools 是一个 用python开发的用于解析 rdb 文件的工具,在解析的时候,它会生成类似于xml sax解析器的事件,在内存检测方面非常有效

它主要有以下三个功能:

  • 生成内存快照
  • 转储成 json 格式
  • 使用标准的 diff 工具比较两个 dump 文件

市面上有用其他语言开发的类似的工具,Rdbtools用Python开发,安装时最好用3以上版本,我这边用的是3.6+,你可以从https://rdbtools.com 中了解到更多的关于管理redis的界面RedisInsight,商业支持,和其他企业级特性

如何安装:

1.python-lzf 是可选安装,但强烈建议你安装,因为它可以加速解析的过程

2.redis-py 是可选的,只是在跑测试的时候有用

建议用pip3安装

pip3 install rdbtools python-lzf

生成内存报告,列出大小大于128字节的,内存占用最大的前10的key的详情,可惜未有经过排序,并生成redis.csv文件

注意:内存使用量是近似的。在一般情况下,略低于实际值。可以根据key或数据库ID或数据类型对报告的内容进行过滤。

内存报告有助于检测是否是应用程序逻辑导致的内存泄露,也有助于优化reids内存使用情况。

./rdb -c memory -l 10 /data/redis/6386/dump.rdb --bytes 128 >/tmp/redis.csv

结果为:

database type key size_in_bytes encoding num_elements len_largest_element expiry
0 hash user_record:251932 26940 hashtable 604 13  
0 string record:277 6232 string 5529 5529 2037-06-26T13:43:49.117000
0 string record:278 6232 string 5544 5544 2037-06-26T13:59:38.661000
0 string record:420 6232 string 5522 5522 2037-03-19T13:33:49.059000
0 string record:526 6232 string 5687 5687 2037-03-26T14:30:06.601000
0 string record:244 7256 string 6276 6276 2037-06-23T15:02:49.080000
0 string record:3151 8280 string 7872 7872 2039-09-01T13:21:30.615000
0 string record:445 10328 string 8374 8374 2037-08-18T08:06:48.196000
0 string record:447 10328 string 8375 8375 2037-08-18T08:16:48.038000
0 hash user_record:126661 25476 hashtable 543 13  

输出字段说明:

database :key在redis的db
type :key类型
key :key值
size_in_bytes :key的内存大小(byte)
encoding :value的存储编码形式
num_elements :key中的value的个数
len_largest_element :key中的value的最大长度
expiry :key过期时间

按键值大小排序(TODO...)

awk -F',' '{print $4,$2,$3,$1}' /tmp/redis.csv | sort  > /tmp/redis_sort.csv

如何输出某个key的占用大小?

./redis-memory-for-key -p 6386 -a ooxx user_record:251932

输出:

Key                             user_record:251932
Bytes                           26940.0
Type                            hash
Encoding                        hashtable
Number of Elements              604
Length of Largest Element       13

 

RedisTimeSeries是一个Redis模块,向Redis添加了时间序列数据结构。

他有如下的功能:

在此处 阅读有关v1.0 GA功能的更多信息 。

  • 高容量插入,低延迟读取
  • 按开始时间和结束时间查询
  • 任何时间段的汇总查询(最小,最大,平均,总和,范围,计数,第一,最后,STD.P,STD.S,Var.P,Var.S)
  • 可配置的最大保留期限
  • 下采样/压缩-自动更新汇总的时间序列
  • 次要索引-每个时间序列都有标签(字段值对),可以按标签查询

下载:https://redislabs.com/download-center/modules/

启动:

redis-server /data/redis/6385/6385.conf --loadmodule /usr/local/redis-5.0.9/redistimeseries.so

这样

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
23天前
|
NoSQL 算法 Redis
redis内存淘汰策略
Redis支持8种内存淘汰策略,包括noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu和volatile-lfu。这些策略分别针对所有键或仅设置TTL的键,采用随机、LRU(最近最久未使用)或LFU(最少频率使用)等算法进行淘汰。
38 5
|
1月前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
1月前
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
75 0
Redis大Key问题如何排查?如何解决?
|
1月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
1月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
1月前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
58 5
|
2月前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
43 1
|
2月前
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
58 2
|
2月前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
125 3
|
2月前
|
JavaScript 前端开发 安全
如何避免闭包带来的内存消耗呢
【10月更文挑战第12天】如何避免闭包带来的内存消耗呢
37 0