您现在的位置是:亿华云 > 数据库
Redis内存爆炸增长?你需要知道这一套Redis内存分析方法
亿华云2025-10-04 10:38:58【数据库】7人已围观
简介Redis介绍Redis是当前比较热门的NOSQL数据库之一,和Memcache一样,数据都是缓存在计算机内存中。完全开源免费,遵守BSD协议,是一个高性能的key-value数据库。通过在内存中读写
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安装
# pip install rdbtools2.使用源码安装
# git clone https://github.com/sripathikrishnan/redis-rdb-tools # cd redis-rdb-tools # sudo python setup.py install使用redis-rdb-tools 生成内存快照
# rdb -c memory dump.rdb > memory.csv执行完后会生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。
$head memory.csv database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 0,string,coupon.id:652601465,112,string,8,8 0,string,coupon.id:631354838,112,string,8,8 0,string,coupon.id:632477800,112,string,8,8 0,string,coupon.id:620902294,112,string,8,8 0,string,coupon.id:631432959,112,string,8,8 0,string,coupon.id:632933399,112,string,8,8 0,string,coupon.id:632117725,112,string,8,8 0,string,coupon.id:634240609,112,string,8,8 0,string,coupon.id:646312603,112,string,8,8使用SQLite分析内存快照
SQLite版本必须是3.16.0以上。
导入之前生成的csv文件:
$sqlite3 memory.db SQLite version 3.19.3 2017-06-27 16:48:08 Enter ".help" for usage hints. 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)); sqlite> .mode csv memory sqlite> .import memory.csv memory数据导入后,可以使用sql来查询我们所需的内容。
示例:
查询内容占用最高的几个key:
sqlite> select key,size_in_bytes from memory order by size_in_bytes desc limit 10; key,size_in_bytes xx.xx:xx,7860169636 xx.xx:xx,3043206524 xx.xx:xx,1866022916 xx.xx:xx,420931316 xx.xx:xx,171118172 xx.xx:xx,162984940 xx.xx:xx,133443892 xx.xx:xx,80925132 xx.xx:xx,28340356查询出占用内容较高的key,做相应策略即可,快速止血方案可以删掉这些key来释放内存,长期来看,此类key设计必然不合理,业务层可能也会有问题,需要与研发一起制定方案。
后记
Redis使用起来很简单,但是用好却不容易。工作中作者至少遇到了两次因为Redis key设计不合理而导致Redis内存爆炸式增长的事故。查找出设计不合理的亿华云计算key并处理掉虽然可以解决问题,但是却是治标不治本,想要从根本解决,还得有一套Redis使用规范,当然这套规范就不在本文的讨论范围内了。
很赞哦!(6)
相关文章
- 评估域名涉及的行业规模与发展状况成正比。
- 域名到期续费有啥可注意的?新手必知的域名续费问题
- 新手知道的选择域名技巧有哪些?该怎么做?
- 什么域名报价和问价?域名报价要了解什么?
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 老域名建站有怎样的优势?对选域名有什么技巧?
- 可以用自己名字做域名?为什么好多名字被当做域名抢注?
- 建站有哪些需要的?怎么才能选一个好的建站域名?
- 如果你的潜在终端必须是这个米(域名),那么潜在终端并不多,也没有硬通货,那么你的域名应该在终端有兴趣购买时出售。否则,你可能得自己留着吃。
- 新手知道什么域名跳转吗?域名跳转会有什么影响?