Oschina的编辑器依旧这么的蛋疼 ,哎写一篇文章改好屡次格式问题。
python
redis文件中的dump.rdb文件是怎么生成的 git
简而言之,dump.rdb是由Redis服务器自动生成的。
默认状况下 每隔一段时间redis服务器程序会自动对数据库作一次遍历,把内存快照写在一个叫作“dump.rdb”的文件 里,这个持久化机制叫作SNAPSHOT。有了SNAPSHOT后,若是服务器宕机,从新启动redis服务器程序时redis会自动加载 dump.rdb,将数据库状态恢复到上一次作SNAPSHOT时的状态。 至于多久作一次SNAPSHOT,SNAPSHOT文件的路径和文件名,你能够在redis的conf文件里指定。除了SNAPSHOT, redis还支持AOF持久化。
ps:(本身备注) github
如今愈来愈多人开始使用Redis了,主要是由于它十分高效、性能强劲、扩展性好。 web
Rdbtools是一个解析dump.rdb文件,并生成内存报告的分析工具,对咱们更好地使用Redis很是有帮助,是一个不可多得的利器。1. 开始安装,使用pip,一个pythoner喜欢用的工具: 正则表达式
# /usr/local/python/bin/easy_install pip
# /usr/local/python/bin/pip install rdbtools
注意pip的版本问题,pip为pip==1.5.6的时候,须要设置sudo easy_install requests==2.3.0,此时的python版本为2.7
后来看pip官方说在pip1.6的时候进行了修复,未测试(后续遇到了再说)
若是您想从源码安装,能够这样作,当前前提是您已有git客户端: redis
git clone https://github.com/sripathikrishnan/redis-rdb-tools cd redis-rdb-tools sudo python setup.py install
2. 好了,让咱们来看一下如何转换dump.rdb文件为JSON格式,查看帮助: shell
# /usr/local/python/bin/rdb --help Usage: rdb [options] /path/to/dump.rdb Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb Options: -h, --help show this help message and exit -c FILE, --command=FILE 要执行的命令json 或 diff -f FILE, --file=FILE 输出文件名 -n DBS, --db=DBS 数据库ID。能够提供多个数据库。若是没有指定,包含全部数据库。 -k KEYS, --key=KEYS 导出键。能够是正则表达式。 -t TYPES, --type=TYPES 数据类型。可能的值有:string, hash, set, sortedset, list。 能够提供多个类型。若是没有指定,全部数据类型都返回。
看了上面帮助,大概知道怎么操做了: 数据库
# 解析并向屏幕打印输出json数据 rdb --command json /var/redis/6379/dump.rdb # 只输出匹配某个key的数据 rdb --command json --key "user.*" /var/redis/6379/dump.rdb # 只解析位于数据库ID为2且以“a”为开头的hash数据 rdb --command json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb
3. 生成内存数据报告: json
rdb -c memory /var/redis/6379/dump.rdb > memory.csv生成CSV格式的内存报告。
有时候,须要查询某个key所使用的内存,若是所有导出来在查找将是很愚蠢且耗时的,对于这种情景,可使用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
若是出现如下错误信息,请记得安装redis模块,由于redis-memory-for-key依赖redis-py包。
Traceback (most recent call last): File "/usr/local/python/bin/redis-memory-for-key", line 8, in <module> load_entry_point('rdbtools==0.1.5', 'console_scripts', 'redis-memory-for-key')() from redis import StrictRedis ImportError: No module named redis5. 比较两个dump.rdb文件:
主要使用 --command diff 选项,并经过管道来排序。
rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt # 而后使用命令 diff diff dump1.txt dump2.txt
但若是想显示得更直观些,可使用kdiff3,由于Kdiff3是图形化工具:
kdiff3 dump1.txt dump2.txt
一样,按照官方介绍,你也可使用解析器来分析,示例代码以下:
import sys from rdbtools import RdbParser, RdbCallback class MyCallback(RdbCallback) : ''' Simple example to show how callback works. See RdbCallback for all available callback methods. See JsonCallback for a concrete example ''' def set(self, key, value, expiry): print('%s = %s' % (str(key), str(value))) def hset(self, key, field, value): print('%s.%s = %s' % (str(key), str(field), str(value))) def sadd(self, key, member): print('%s has {%s}' % (str(key), str(member))) def rpush(self, key, value) : print('%s has [%s]' % (str(key), str(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')
使用redis-rdb-tools分析:http://space.wudiweb.com/phychion/blog/95
redis-rdb-tools官方:https://github.com/sripathikrishnan/redis-rdb-tools
redis的.rdb是什么:http://zhidao.baidu.com/link?url=PR5zyWATKdIwF2qPRtev-KheJdF_qxOtV8Dyyl0JTeCKScG4SVkFZEJm9ZhP68clDkLNiD6RdzhJ2r2tk4C_VftzzaPeGRUzM3qxNNA0Moe