• python redis-rdb工具 分析redis工具


    解析Redis dump.rdb文件,分析内存并将数据导出到JSON

    Rdbtools是Redis的dump.rdb文件的解析器。解析器生成类似于xml sax解析器的事件,并且在内存方面非常有效。

    另外,rdbtools提供了以下实用程序:

    1. 生成所有数据库和键中数据的内存报告
    2. 将转储文件转换为JSON
    3. 使用标准差异工具比较两个转储文件

    尽管有其他语言的类似项目,但Rdbtools是用Python编写的。有关更多信息,请参见常见问题解答

    请参阅https://rdbtools.com以获取用于管理Redis,商业支持和其他企业功能的gui。

    安装rdbtools

    先决条件:

    1. python-lzf是可选的,但强烈建议加快解析速度。
    2. redis-py是可选的,仅在运行测试用例时需要。

    要从PyPI安装(推荐):

    pip install rdbtools python-lzf
    

    要从源代码安装:

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

    命令行用法示例

    每次运行RDB Tool时都需要指定一个命令,以指示对解析的RDB数据应执行的操作。有效命令为:json,diff,justkeys,justkeyvals和协议。

    来自两个数据库转储的JSON:

    > rdb --command json /var/redis/6379/dump.rdb
    
    [{
    "user003":{"fname":"Ron","sname":"Bumquist"},
    "lizards":["Bush anole","Jackson's chameleon","Komodo dragon","Ground agama","Bearded dragon"],
    "user001":{"fname":"Raoul","sname":"Duke"},
    "user002":{"fname":"Gonzo","sname":"Dr"},
    "user_list":["user003","user002","user001"]},{
    "baloon":{"helium":"birthdays","medical":"angioplasty","weather":"meteorology"},
    "armadillo":["chacoan naked-tailed","giant","Andean hairy","nine-banded","pink fairy"],
    "aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]
    

    过滤解析的输出

    仅与正则表达式匹配的过程键,并且仅打印键和值:

    > rdb --command justkeyvals --key "user.*" /var/redis/6379/dump.rdb
    
    user003 fname Ron,sname Bumquist,
    user001 fname Raoul,sname Duke,
    user002 fname Gonzo,sname Dr,
    user_list user003,user002,user001
    

    在数据库2中,仅以“ a”开头的过程散列:

    > rdb -c json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb
    
    [{},{
    "aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]
    

    将转储文件转换为JSON

    json命令输出是UTF-8编码的JSON。默认情况下,回调尝试使用UTF-8解析RDB数据,并使用U符号转义非'ASCII可打印'字符,或使用来转义非UTF-8可解析的字节x尝试对RDB数据进行解码可能会导致二进制数据curroption,可以通过使用该--escape raw选项来避免这种情况另一种选择是-e base64用于二进制数据的Base64编码。

    解析转储文件并在标准输出上打印JSON:

    > rdb -c json /var/redis/6379/dump.rdb
    
    [{
    "Citat":["Bu00e4ttre sent u00e4n aldrig","Bra karl reder sig sju00e4lv","Man ska inte ku00f6pa grisen i su00e4cken"],
    "bin_data":"\xFEu0000u00e2\xF2"}]
    

    将转储文件解析为原始字节,并在标准输出上打印JSON:

    > rdb -c json /var/redis/6379/dump.rdb --escape raw
    
    [{
    "Citat":["Bu00c3u00a4ttre sent u00c3u00a4n aldrig","Bra karl reder sig sju00c3u00a4lv","Man ska inte ku00c3u00b6pa grisen i su00c3u00a4cken"],
    "bin_data":"u00feu0000u00c3u00a2u00f2"}]
    

    生成内存报告

    与一起运行会 -c memory生成CSV报告,其中包含该键使用的近似内存。--bytes C并且'--largest N可用于将输出限制为大于C个字节的键或N个最大的键。

    > rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
    > cat memory.csv
    
    database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
    0,list,lizards,241,quicklist,5,19
    0,list,user_list,190,quicklist,3,7
    2,hash,baloon,138,ziplist,3,11
    2,list,armadillo,231,quicklist,5,20
    2,hash,aroma,129,ziplist,3,11
    

    生成的CSV具有以下列-数据库编号,数据类型,密钥,字节使用的内存和RDB编码类型。内存使用情况包括键,值和任何其他开销。

    请注意,内存使用情况是近似的。通常,实际使用的内存将略高于报告的内存。

    您可以按键或数据库编号或数据类型过滤报告。

    内存报告应有助于您检测由应用程序逻辑引起的内存泄漏。它还将帮助您优化Redis的内存使用。

    查找单键使用的内存

    有时,您只想查找特定键使用的内存,并且在转储文件上运行整个内存报告非常耗时。

    在这种情况下,可以使用以下redis-memory-for-key命令:

    > redis-memory-for-key person:1
    
    > redis-memory-for-key -s localhost -p 6379 -a mypassword person:1
    
    Key 			person:1
    Bytes				111
    Type				hash
    Encoding			ziplist
    Number of Elements		2
    Length of Largest Element	8
    

    注意 :

    1. 这已添加到redis-rdb-tools版本0.1.3中
    2. 此命令取决于redis-py软件包

    比较RDB文件

    首先,使用--command diff选项,并将输出通过管道传递到标准sort实用程序

    > rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt
    > rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt
    

    然后,运行您喜欢的差异程序

    > kdiff3 dump1.txt dump2.txt
    

    要限制文件的大小,您可以使用--key选项过滤键

    发出Redis协议

    您可以使用以下命令将RDB文件转换为redis协议protocol

    > rdb -c protocol /var/redis/6379/dump.rdb
    
    *4
    $4
    HSET
    $9
    users:123
    $9
    firstname
    $8
    Sripathi
    

    您可以将输出通过管道传输到netcat并重新导入数据的子集。例如,如果要将数据分片为两个Redis实例,则可以使用--key标志选择数据的子集,然后将输出传递给正在运行的Redis实例以加载该数据。阅读Redis Mass Insert以获得更多信息。

    当输出打印协议时,该--escape选项可与一起使用printableutf8避免使用不可打印/控制字符。

    默认情况下,如果过期时间在rdb文件中存在,则会逐字发出,从而导致删除过去所有过期的键。如果不需要此行为,则该-x/--no-expire选项将忽略所有密钥到期命令。

    否则,您可能希望使用-a/--amend-expire选项设置将来的过期时间,该选项会为已设置为过期的每个密钥的过期时间增加整数秒数。这不会更改尚未设置有效期的密钥。

    使用解析器

    from rdbtools import RdbParser, RdbCallback
    from rdbtools.encodehelpers import bytes_to_unicode
    
    class MyCallback(RdbCallback):
        ''' Simple example to show how callback works.
            See RdbCallback for all available callback methods.
            See JsonCallback for a concrete example
        '''
    
        def __init__(self):
            super(MyCallback, self).__init__(string_escape=None)
    
        def encode_key(self, key):
            return bytes_to_unicode(key, self._escape, skip_printable=True)
    
        def encode_value(self, val):
            return bytes_to_unicode(val, self._escape)
    
        def set(self, key, value, expiry, info):
            print('%s = %s' % (self.encode_key(key), self.encode_value(value)))
    
        def hset(self, key, field, value):
            print('%s.%s = %s' % (self.encode_key(key), self.encode_key(field), self.encode_value(value)))
    
        def sadd(self, key, member):
            print('%s has {%s}' % (self.encode_key(key), self.encode_value(member)))
    
        def rpush(self, key, value):
            print('%s has [%s]' % (self.encode_key(key), self.encode_value(value)))
    
        def zadd(self, key, score, member):
            print('%s has {%s : %s}' % (str(key), str(member), str(score)))
    
    
    callback = MyCallback()
    parser = RdbParser(callback)
    parser.parse('/var/redis/6379/dump.rdb')
    ###################################################

    方法一(推荐)使用rbdtools   高效

    #安装rdbtools

    yum -y install gcc

    yum -y install epel-release

    yum -y install python-pip

    yum install python-devel

    不安装会报错Python.h:没有那个文件或目录

    pip install rdbtools

    rdb -c memory  /usr/local/services/redis/dbbak/dump.rdb > /tmp/result.csv

    然后把csv拿出来看就可以  也可以不输出到csv  直接打印在屏幕上

    方法二#使用自带的工具

    redis-cli -a pdabc  --bigkeys

    ######################################

    其他页面

    1. 经常问的问题
    2. Redis转储文件规范
    3. Redis转储文件版本历史记录-还具有将转储文件转换为旧版本的说明。
  • 相关阅读:
    selenium 下载百度音乐并验证
    selenium web driver 实现截图功能
    selenium web driver 使用JS修改input属性
    .net测试学习--理解.net测试选项
    试水STF(smartphone test farm)
    The difference between QA, QC, and Test Engineering
    selenium 3.0 beta2 初体验
    Gson解析纯Json数组
    Android带图片的Toast(自定义Toast)
    Android issues
  • 原文地址:https://www.cnblogs.com/lgj8/p/14148248.html
Copyright © 2020-2023  润新知