zoukankan      html  css  js  c++  java
  • redis 分析rdb中key

    1.问题:

    单位一个redis集群内存报警,想找出所有的key的列表?

    2.解决办法:

    网上搜索是可以用redis-rdb-tools 这个工具进行分析

     (1)centos6 默认安装python2.6,需要安装python2.7环境

           

    wget https://centos6.iuscommunity.org/ius-release.rpm
    rpm -Uvh ius-release.rpm
    yum install python27 python27-devel python27-pip
    

     (2)下载redis-rdb-tools 源码包

    wget https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip
    unzip master.zip 
    cd redis-rdb-tools-master/
    python2.7 setup.py install

       安装python-lzf时遇到问题:

    error: command 'gcc' failed with exit status 1

     解决方法:

    $ sudo yum -y install gcc gcc-c++ kernel-devel

    $ sudo yum -y install python-devel libxslt-devel libffi-devel openssl-devel

    $ pip install python-lzf  

    上面用python2.6会有问题

      (3)然后用rdb分析rdb的dump

      获取对应redis的rdb文件,使用redis-rdb-tools生成内存快照

    #/usr/bin/rdb -c memory dump.rdb >redis_dump.txt
     #sort -t, -k4nr redis_dump.txt

     

    (4)把数据导入sqlite(mysql数据库实际上都能导入),sqlite语法和mysql基本一致

    splite3 test.db

    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),time varchar(128));

    sqlite>.mode csv memory

     sqlite>.import memory.csv memory

    (5)查询

    查询key个数

    sqlite>select count(*) from memory;

    查询总的内存占用

    sqlite> select sum(size_in_bytes) from memory;

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

    sqlite>select * from memory order by size_in_bytes desc limit 10;

    扩展:

    转换dump文件到JSON

     3.1 解析dump文件并以JSON格式标准输出

    # /usr/local/python/bin/rdb --command json /data/redis_data/6379/dump.rdb

    3.2 只解析符合正则的keys

    # /usr/local/python/bin/rdb --command json --key "sences_2.*" /data/redis_data/6379/dump.rdb

    3.3 只解析以“a”为开头的hash且位于数据库ID为2的

    # /usr/local/python/bin/rdb --command json --db 2 --type hash --key "a.*" /data/redis_data/6379/dump.rdb

    生成内存报告

    生成CSV格式的内存报告。包含的列有:数据库ID,数据类型,key,内存使用量(byte),编码。内存使用量包含key、value和其他值。
    注意:内存使用量是近似的。在一般情况下,略低于实际值。
    可以根据key或数据库ID或数据类型对报告的内容进行过滤。
    内存报告有助于检测是否是应用程序逻辑导致的内存泄露,也有助于优化reids内存使用情况。

    可以使用--help中,有一个命令查询前多少个key占内存最大,具体是哪个命令忘了

    # /usr/local/python/bin/rdb -c memory /data/redis_data/6379/dump.rdb > redis_memory_report.csv
    内容如下所示:
    database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
    0,string,"ot_0_3b0703c01015ce05f76ef4b977dc020e820d0692",351,string,184,184
    0,hash,"sences_98558",1703,hashtable,10,132
    0,hash,"sences_170989",1698,hashtable,10,138
    0,hash,"sences_34233",1673,hashtable,10,115

    单个key所使用的内存量

    有时候,需要查询某个key所使用的内存。如果全部导出来在查找将是很愚蠢且耗时的。对于这种情景,可以使用redis-memory-for-key命令。
    如果出现下面信息,需要安装redis模块。redis-memory-for-key依赖redis-py包。

    1. # /usr/local/python/bin/pip install redis
    2.  
      # /usr/local/python/bin/easy_install redis      
    # /usr/local/python/bin/redis-memory-for-key --help
    Usage: redis-memory-for-key [options] redis-key
    Examples :
    redis-memory-for-key user:13423
    redis-memory-for-key -h localhost -p 6379 user:13423
    Options:
      -h, --help            show this help message and exit
      -s HOST, --server=HOST
                            Redis Server hostname. Defaults to 127.0.0.1
      -p PORT, --port=PORT  Redis Server port. Defaults to 6379
      -a PASSWORD, --password=PASSWORD
                            Password to use when connecting to the server
      -d DB, --db=DB        Database number, defaults to 0

    实例如下:

           

    # /usr/local/python/bin/redis-memory-for-key -s 10.1.242.124   sence_167989
    Key                             "sence_167989"
    Bytes                           2712.0
    Type                            hash
    Encoding                        hashtable
    Number of Elements              15
    Length of Largest Element       22
    

      

    比RDB文件

    使用–command diff选项,并通过管道来进行排序。

      1.  
        # /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump1.txt
      2.  
        # /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump2.txt
      3.  diff dump1.txt dump2.txt

        

  • 相关阅读:
    ssh scp命令详解
    python模块与包
    python参数Sample Code
    python 多线程简介
    python virtualenv环境安装(ubuntu)
    python pip 代理设置
    mysql资源总结
    mysql索引原理及用法
    Oracle学习笔记:利用user_segments查表的大小
    Oracle学习笔记:dba_tables、all_tables、user_tables区别
  • 原文地址:https://www.cnblogs.com/wangyh702/p/11907793.html
Copyright © 2011-2022 走看看