新版rdb解析工具

工具代码地址: https://github.com/git-hulk/rdbtools

2014 年因为工作需要实现了一版 rdb 解析工具,具体见 http://www.hulkdev.com/posts/rdbtools。本来想说要支持 rdb 转换为多种格式, 如 aof, json等, 后面因为自己懒惰而没有做到。

iamge

换个姿势

那么问题来了,这个事情拖了一年多了,还做不做?

挣扎着撸起来看了看,妈的,这他么是我写的么,卧槽! 这代码,这变量名好陌生,这坨屎好刺眼...

最后决定做两个事情:

  1. 重构老代码
  2. 支持 lua 来处理数据

重构代码的利用很简单,一年前拉的屎实在臭,当然我也没说现在拉就不臭。用 lua 来处理数据格式理由也很简单,要输出多重格式用 c 实现,简直就是作死...

使用

$ cd rdbtools/src
$ make
$ ./rdbtools -f ../tests/dump2.4.rdb -s ../scripts/example.lua

还是这么 easy, 先 make 编译生成可执行文件, 然后使用 -f 指定 rdb 文件放在哪里。 -s 指定用来处理的 lua 文件, 默认是 ../scripts/example.lua, 里面会回调 handle 函数.

如果编译遇到 readline.h 找不到的编译错误,莫慌,请报警... 哦,不是, 如果你是 centos 就执行 sudo yum install -y readline readline-devel, 如果是 ubuntu 请使用 apt-get

json 格式

如果使用 lua 处理数据,我要生成 json 格式就简单的不要不要的了,就几行代码:

cat scripts/json_example.lua

local cjson = require "cjson"

function handle(item)
     print(cjson.encode(item))
end  

卧槽~~~~~ 这不科学, 这动摇了我对 php 是最好的语言的想法,一定是打开姿势不对。。。

自定义格式

我们通过例子也看到了,我们其实是把数据交给回调函数 handle 来处理了,么么哒。

那么看一下, 这个函数的参数, 它是一个 hashtable, 里面有下面几个字段

function handle(item)

-- item.type, value的类型,可能是 string, list, set, hash, zset
-- item.expire_time, 过期时间
-- item.key, key
-- item.value, value(type 决定了value的类型)
end

等等,是不是少了 select db, 我怎么知道当前的 kv 是在哪个 db 里面的? 聪明的少年,我帮你想好了, 你只要访问 env.db_num 就可以了, env.version 还能知道当前的 rdb 版本哟~~

最后

尽情享受~

叫我雷锋~