GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

sripathikrishnan

redis-rdb-tools – Redis dump.rdbファイルの解析、メモリの解析、データのJSONへのエクスポート

投稿日:

Redis dump.rdbファイルの解析、メモリの解析、データのJSONへのエクスポート https://rdbtools.com

Redis dump.rdbファイルの解析、メモリの解析、データのJSONへのエクスポート

RdbtoolsはRedisのdump.rdbファイルのパーサーです。 パーサは、xmlサックスパーサーと同様のイベントを生成し、非常に効率的なメモリです。

さらに、rdbtoolsは次のユーティリティを提供します。

  1. すべてのデータベースとキーにまたがるデータのメモリレポートを生成する
  2. ダンプファイルをJSONに変換する
  3. 標準diffツールを使用して2つのダンプファイルを比較する

RdbtoolsはPythonで書かれていますが、他の言語でも同様のプロジェクトがあります。 詳細については、 FAQを参照してください。

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ツールを実行するたびに、解析されたRDBデータの処理内容を示すコマンドを指定する必要があります。 有効なコマンドは、json、diff、justkeys、justkeyvals、およびprotocolです。

2つのデータベースダンプからの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以外の文字をエスケープしたり、 \x UTF-8で解析できないバイトをエスケープしようとします。 RDBデータをデコードしようとすると、バイナリデータの処理につながる可能性があります。これは、 --escape rawオプションを使用することで回避できます。 別のオプションは、バイナリデータのBase64エンコーディングに-e base64を使用することです。

ダンプファイルを解析し、JSONを標準出力に出力します:

> rdb -c json /var/redis/6379/dump.rdb

[{
"Citat":["B\u00e4ttre sent \u00e4n aldrig","Bra karl reder sig sj\u00e4lv","Man ska inte k\u00f6pa grisen i s\u00e4cken"],
"bin_data":"\\xFE\u0000\u00e2\\xF2"}]

ダンプファイルを解析して生のバイトに変換し、標準出力にJSONを出力します。

> rdb -c json /var/redis/6379/dump.rdb --escape raw

[{
"Citat":["B\u00c3\u00a4ttre sent \u00c3\u00a4n aldrig","Bra karl reder sig sj\u00c3\u00a4lv","Man ska inte k\u00c3\u00b6pa grisen i s\u00c3\u00a4cken"],
"bin_data":"\u00fe\u0000\u00c3\u00a2\u00f2"}]

メモリレポートを生成する

-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オプションを使用し、出力を標準ソートユーティリティにパイプします

> 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オプションを使用してキーを--keyできます

発光型赤外線プロトコル

protocolコマンドを使用すると、RDBファイルをredisプロトコルのストリームに変換できます。

> rdb --c protocol /var/redis/6379/dump.rdb

*4
$4
HSET
$9
users:123
$9
firstname
$8
Sripathi

出力をnetcatにパイプし、データのサブセットを再インポートすることができます。 たとえば、データを2つのredisインスタンスに分割する場合は、–keyフラグを使用してデータのサブセットを選択し、出力を実行中のredisインスタンスにパイプしてそのデータをロードできます。 詳細については、 Redis Mass Insertをお読みください。

プロトコル出力を印刷するときに、 printableまたはutf8--escapeオプションを使用すると、 printableできない/制御文字を避けることができます。

パーサーの使用

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')

その他のページ

  1. よくある質問
  2. Redisダンプファイルの仕様
  3. Redis Dump Fileのバージョン履歴 – ダンプファイルを古いバージョンに変換する際の注意点もあります。

ライセンス

rdbtoolsは、MITライセンスの下で使用許諾されます。 LICENSEを参照してください

維持者

スリッタティ・クリシュナン:@ srithedabbler

クレジット

  1. ディディエ・スペジア
  2. ヨアブ・スタインバーグ
  3. ダニエル・メッツァット
  4. カルロカバニージャ
  5. Josep M. Pujol
  6. チャールズゴードン
  7. ジャスティンポリイ







-sripathikrishnan
-

執筆者: