|
|
51CTO旗下网站
|
|
移动端

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

Redis是当前比较热门的NOSQL数据库之一,和Memcache一样,数据都是缓存在计算机内存中。完全开源免费,遵守BSD协议,是一个高性能的key-value数据库。通过在内存中读写数据,大大提高了数据读写速度,可以说Redis是实现网站高并发不可或缺的一部分。

作者:佚名来源:今日头条|2019-10-24 08:43

【线上直播】11月21日晚8点贝壳技术总监侯圣文《数据安全之数据库安全黄金法则》

Redis介绍

Redis是当前比较热门的NOSQL数据库之一,和Memcache一样,数据都是缓存在计算机内存中。完全开源免费,遵守BSD协议,是一个高性能的key-value数据库。通过在内存中读写数据,大大提高了数据读写速度,可以说Redis是实现网站高并发不可或缺的一部分。

Redis内存占用分布

Redis作为内存数据库,在内存中存储的内容主要是数据(键值对);除了数据以外,Redis的其他部分也会占用内存,内存占用主要可以划分为以下几个部分:

数据

数据是数据库最主要的组成部分。Redis使用键值对存储数据,其中包括五种类型:字符串、哈希、列表、集合、有序集合。

本身运行需要的内存

Redis本身也是一个程序,主进程运行及创建的子进程运行也需要占用内存,但这部分占用内存极少,大多数情况下可以忽略。

缓冲内存

缓冲内存包括客户端缓冲区、复制积压缓冲区、AOF缓冲区等,这部分占用内存也很少。

内存碎片

内存碎片是Redis在分配、回收物理内存过程中产生的。内存碎片产生原因主要是对数据的频繁修改造成,导致Redis释放的空间在物理内存中并没有被释放。若Redis服务器中内存碎片很大,可以通过安全重启方式释放内存。

Redis内存分析过程

分析Redis内存我们一般会采用bgsave生成dump.rdb文件再结合redis-rdb-tools和 sqlite或其他数据库来进行静态分析。

BGSAVE:在后台异步(Asynchronously)保存当前数据库的数据到磁盘。

BGSAVE 命令执行之后立即返回 OK,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

生成内存快照:redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,主要用它生成内存快照。

安装redis-rdb-tools

1.使用pip安装

  1. # pip install rdbtools 

2.使用源码安装

  1. # git clone https://github.com/sripathikrishnan/redis-rdb-tools 
  2. # cd redis-rdb-tools 
  3. # sudo python setup.py install 

使用redis-rdb-tools 生成内存快照

  1. # rdb -c memory dump.rdb > memory.csv 

执行完后会生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。

  1. $head memory.csv 
  2. database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 
  3. 0,string,coupon.id:652601465,112,string,8,8 
  4. 0,string,coupon.id:631354838,112,string,8,8 
  5. 0,string,coupon.id:632477800,112,string,8,8 
  6. 0,string,coupon.id:620902294,112,string,8,8 
  7. 0,string,coupon.id:631432959,112,string,8,8 
  8. 0,string,coupon.id:632933399,112,string,8,8 
  9. 0,string,coupon.id:632117725,112,string,8,8 
  10. 0,string,coupon.id:634240609,112,string,8,8 
  11. 0,string,coupon.id:646312603,112,string,8,8 

使用SQLite分析内存快照

SQLite版本必须是3.16.0以上。

导入之前生成的csv文件:

  1. $sqlite3 memory.db 
  2. SQLite version 3.19.3 2017-06-27 16:48:08 
  3. Enter ".help" for usage hints. 
  4. 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)); 
  5. sqlite> .mode csv memory 
  6. sqlite> .import memory.csv memory 

数据导入后,可以使用sql来查询我们所需的内容。

示例:

查询内容占用最高的几个key:

  1. sqlite> select key,size_in_bytes from memory order by size_in_bytes desc limit 10; 
  2. key,size_in_bytes 
  3. xx.xx:xx,7860169636 
  4. xx.xx:xx,3043206524 
  5. xx.xx:xx,1866022916 
  6. xx.xx:xx,420931316 
  7. xx.xx:xx,171118172 
  8. xx.xx:xx,162984940 
  9. xx.xx:xx,133443892 
  10. xx.xx:xx,80925132 
  11. xx.xx:xx,28340356 

查询出占用内容较高的key,做相应策略即可,快速止血方案可以删掉这些key来释放内存,长期来看,此类key设计必然不合理,业务层可能也会有问题,需要与研发一起制定方案。

后记

Redis使用起来很简单,但是用好却不容易。工作中作者至少遇到了两次因为Redis key设计不合理而导致Redis内存爆炸式增长的事故。查找出设计不合理的key并处理掉虽然可以解决问题,但是却是治标不治本,想要从根本解决,还得有一套Redis使用规范,当然这套规范就不在本文的讨论范围内了。

【编辑推荐】

  1. Redis集群的5种使用方式,各自优缺点分析
  2. Java8 JVM内存结构变了,永久代到元空间
  3. 解决了Redis的这些问题,你就是Redis高手
  4. Redis集群都有哪些模式
  5. 稳了!用Redis实现“附近的人”功能
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

中间件安全防护攻略

中间件安全防护攻略

4类安全防护
共4章 | hack_man

111人订阅学习

CentOS 8 全新学习术

CentOS 8 全新学习术

CentOS 8 正式发布
共16章 | UbuntuServer

274人订阅学习

用Python玩转excel

用Python玩转excel

让重复操作傻瓜化
共3章 | DE8UG

231人订阅学习

读 书 +更多

Windows编程启示录

主要内容: ● 如何设计像自动售货机那样有效的用户界面。 ● 深入理解窗口和对话框的管理机制。 ● 为什么性能优化与我们在直觉上的理...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微