zoukankan      html  css  js  c++  java
  • redis内存分析

    redis内存分析和清理

    web项目中经常会使用redis作为缓存,当项目了运行一段时间后,由于不恰当的使用方法和需求迭代频繁,导致redis内存快速增长,这时就需要对redis的key进行分析,删掉无用的key以节省空间

    使用redis自带的命令查看

    使用redis自带的info keyspace命令可以查看简略的key分布情况

    img

    使用rdbtools工具分析

    rdbtools是用python开发的第三方工具,主要作用有:

    1.生成csv分析报告

    rdb -c memory dump.rdb > redis_memory_report.csv
    

    2.生成json

    rdb -c json dump.rdb > redis_json_report.json
    

    3.比较两个dump文件

    rdb -c diff dump1.rdb | sort > dump1.txt
    rdb -c diff dump2.rdb | sort > dump2.txt
    kdiff3 dump1.txt dump2.txt
    

    补充:需要先安装kdiff3

    yum install kdiff3
    

    安装

    1.pip安装

    pip isntall rdbtools
    

    2.源码安装

    git clone https://github.com/sripathikrishnan/redis-rdb-tools.git
    cd redis-rdb-tools/
    python setup.py install
    

    安装加速工具,加快解析速度

    # 安装依赖包
    yum install python-devel
    # 安装加速工具
    pip install python-lzf
    

    生成内存报告

    使用之前先要获取到redis的快照(rdb文件),使用以下命令生成内存报告

    rdb -c memory dump.rdb -f dump_memory_report.csv
    

    生成的csv文件如下

    img

    上述字段的意义如下:

    database: key的redis的db
    type: key速度类型
    key: key的名称
    size_in_bytes: key的内存大小(byte)
    encoding: value的存储编码形式
    num_elements: key中的元素的个数(list,set,zset等)
    len_largest_element: key中的value的最大长度
    expiry: key的过期时间
    

    如果需要对内存报告进行进一步的分析,可以将csv导入mysql

    先建一张表

    CREATE TABLE redis_memory_report (
        `database` tinyint(2) NOT NULL DEFAULT 0 COMMENT '数据库',
        `type` varchar(32) NOT NULL DEFAULT '' COMMENT 'key类型',
        `key` varchar(255) NOT NULL DEFAULT '' COMMENT 'key',
        `size_in_bytes` int(11) NOT NULL DEFAULT 0 COMMENT '内存大小',
        `encoding` varchar(32) NOT NULL DEFAULT '' COMMENT '编码',
        `num_elements` int(11) NOT NULL DEFAULT 0 COMMENT 'value中元素个数',
        `len_largest_element` int(11) NOT NULL DEFAULT 0 COMMENT 'value的最大长度',
        `expiry` varchar(128) NOT NULL DEFAULT ''
    )ENGINE=InnoDB DEFAULT CHARSET=utf8
    

    导入数据

    load data infile 'redis_memory_report.csv' into table redis_memory_report
    fields terminated by ',' optionally enclosed by '"'
    escaped by '"' lines terminated by '
    ';
    

    注意在linux下,结束换行符是' '

    如果报错

    The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
    
    show variables like 'secure%';
    

    结果

    +------------------+-------+
    | Variable_name | Value |
    +------------------+-------+
    | secure_auth | ON |
    | secure_file_priv | NULL |
    +------------------+-------+
    

    说明是secure_file_priv这个变量没有配置造成的

    解决办法

    找到配置文件my.ini或者my.cnf,在[mysqld]下面加入一行配置

    secure_file_priv = '/var'    # 表示允许目录/var下面的文件导入到数据库
    

    将csv文件移到/var目录下,再次执行导入

    分析内存报告

    1)查询key的个数

    select count(*) from dump_memory_report;
    

    2)查询总的内存占用

    select count(size_in_bytes) from dump_memory_report;
    

    3)查询内存占用最高的10个key

    select * from dump_memory_report order by size_in_bytes desc limit 10;
    

    查询单个key所使用的内存量

    可以使用redis自带的命令redis-memory-for-keys

    redis-memory-for-key 127.0.0.1 -p 6379 -a mypassword key_name
    

    结果

    Key                             name
    Bytes                           64
    Type                            string
    
  • 相关阅读:
    关于php操作windows计划任务管理
    学习: 导航器添加修饰符
    写给想学 Javascript 朋友的一点经验之谈
    Firebug Tutorial – Logging, Profiling and CommandLine (Part I)
    getElementsByClass(2)
    关于JavaScript的事件
    Javascript修改对象方法
    采用哪种方式(JS高级程序设计)
    getElementsByClass(1)
    让CSS更简洁、高效些,别再想当然了
  • 原文地址:https://www.cnblogs.com/zzliu/p/12236395.html
Copyright © 2011-2022 走看看