最近工作中需要用到一個将資料從Redis導出到文本(或從文本導入Redis)的工具。找到一個用Ruby寫的開源軟體redis-dump( http://delanotes.com/redis-dump/ )。
1 redis-benchmark -t set -d 1000 -n 1000000 -r 50000000 -h xxx.xxx.xxx.xxx -p 6379
利用上面的指令向Redis中set了100萬條1K大小資料,本地測試下redis-dump的性能,QPS大約在2500左右,實在太慢,隻好自己實作一個小工具。
看了看源碼,redis-dump采用同步方式擷取資料,無法充分利用Redis Server的性能。能想到的改進自然是異步的擷取資料,hiredis的異步接口要和libevent、libev等異步通信庫結合起來使用,這裡有幾個例子(
https://github.com/redis/hiredis/tree/master/examples)。代碼很簡單,首先KEYS *擷取所有的key,再将所有的DUMP key指令寫入redisAsyncCommand交由event_base分發,在callback中将DUMP出的二進制資料處理一下和KEY值一起寫入文本。
測試了一下,本地異步導入、導出的QPS達到了10萬,整整是redis-dump的40倍。