当前位置: 首页 > 科技观察

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

时间:2023-03-21 21:11:49 科技观察

Redis简介Redis是比较流行的NOSQL数据库之一。与Memcache一样,数据缓存在计算机内存中。完全开源免费,遵循BSD协议,是一个高性能的key-value数据库。通过在内存中读写数据,大大提高了数据读写的速度。可以说Redis是实现网站高并发不可或缺的一部分。Redis内存占用分布Redis作为内存数据库使用,内存中存储的内容主要是数据(键值对);除了数据,Redis的其他部分也会占用内存,而内存占用可以分为以下几个部分:数据data是数据库的主要组成部分。Redis使用键值对来存储数据,包括五种类型:字符串、哈希、列表、集合和有序集合。自身运行所需的内存Redis本身也是一个程序。主进程和创建的子进程也需要占用内存,但这部分占用内存很少,大多数情况下可以忽略。BuffermemoryBuffermemory包括clientbuffer、copybacklogbuffer、AOFbuffer等,这部分占用的内存很少。内存碎片内存碎片是Redis在分配和回收物理内存的过程中产生的。内存碎片产生的主要原因是频繁修改数据,导致Redis释放的空间没有在物理内存中释放。如果Redis服务器内存碎片较大,可以通过安全重启释放内存。Redis内存分析流程分析Redis内存,我们一般使用bgsave生成dump.rdb文件,然后结合redis-rdb-tools和sqlite或者其他数据库进行静态分析。BGSAVE:在后台将当前数据库的数据异步保存到磁盘。BGSAVE命令执行后立即返回OK,然后Redisfork一个新的子进程。原来的Redis进程(父进程)继续处理客户端请求,子进程负责将数据保存到磁盘,然后退出。生成内存快照:redis-rdb-tools是一个用于解析rdb文件的python工具。在分析内存时,主要用于生成内存快照。安装redis-rdb-tools1。使用pip安装#pipinstallrdbtools2。使用源码安装#gitclonehttps://github.com/sripathikrishnan/redis-rdb-tools#cdredis-rdb-tools#sudopythonsetup.pyinstall使用redis-rdb-tools生成内存快照后#rdb-cmemorydump.rdb>memory.csv被执行,将生成CSV格式的内存报告。包含的列是:数据库ID、数据类型、键、内存使用(字节)、编码。内存使用包含键、值和其他值。$headmemory.csvdatabase,type,key,size_in_bytes,encoding,num_elements,len_largest_element0,string,coupon.id:652601465,112,string,8,80,string,coupon.id:631354838,112,string,8,80,string,coupon.id:632477800,112,string,8,80,string,coupon.id:620902294,112,string,8,80,string,coupon.id:631432959,112,string,8,80,string,coupon.id:632933399,112,string,8,80,string,coupon.id:632117725,112,string,8,80,string,coupon.id:634240609,112,string,8,80,string,coupon.id:646312603,112,string,8,8使用SQLite分析内存快照SQLite版本必须是3.16.0或更高版本。导入之前生成的csv文件:$sqlite3memory.dbSQLiteversion3.19.32017-06-2716:48:08Enter.help"forusagehints.sqlite>createtablememory(databaseint,typevarchar(128),keyvarchar(128),size_in_bytesint,encodingvarchar(128),num_elementsint,len_largest_elementvarchar(128));sqlite>.modecsvmemorysqlite>.importmemory.csvmemory数据导入后,就可以使用sql查询我们需要的了。例子:查询内容占用最高的几个key:sqlite>selectkey,size_in_bytesfrommemoryorderbysize_in_bytesdesclimit10;key,size_in_bytesxx.xx:xx,7860169636xx.xx:xx,3043206524xx.xx:xx,1866022916xx.xx:xx,42093x213167xx,3167xx,42093x13167xx.xx:xx.x??x:xx,162984940xx.xx:xx,133443892xx.xx:xx,80925132xx.xx:xx,28340356查询内容高的key,做相应的策略。快速止血的方案可以删除这些key来释放内存,从长远来看,这类key的设计势必不合理,业务层可能会出现问题,所以需要和研发一起制定方案。后记Redis好用,但不好用。在工作过程中,笔者至少遇到过两次由于Rediskey设计不合理导致Redis内存爆炸的事故。查找和处理设计不合理的按键可以解决问题,但只是治标不治本。要想从根本上解决,就必须要有一套Redis的使用规范。当然,这套规范不在本文讨论范围之内。