redis の db の中身をluaでダンプする
これ の続きというか、
redis-server に lua を投げて、サーバの中で SCAN してキーと値を返すやつを清書したので、メモがてらに。
環境
$ python -V
Python 3.7.2
$ redis-cli info | grep redis_version
redis_version:5.0.5
コード
hash とか set の時は HSCAN
とか ZSCAN
とかに適宜読み替えてください。
dump.lua
local cr = KEYS[1]
local num = KEYS[2]
local match = KEYS[3]
local cr2, keys = unpack(redis.call("SCAN", cr, "MATCH", match, "COUNT", num))
local values = redis.pcall("MGET", unpack(keys))
return {cr2, keys, values}
export.py
#!/usr/bin/env python
import os
import redis
import click
DEFAULT_REDIS_URL = "redis://localhost:6379/3"
DEFAULT_LUA_FILE = "dump.lua"
def scan_iter(r, lua_script, bulk=2000, match="*"):
f = r.register_script(lua_script)
cr = "0"
while True:
cr, keys, values = f(keys=[cr, bulk, match])
if cr == b"0":
break
yield from zip(keys, values)
@click.command()
@click.option("--redis-url", envvar="REDIS_URL", default=DEFAULT_REDIS_URL)
@click.option("--lua-file", envvar="LUA_FILE", default=DEFAULT_LUA_FILE, type=click.File("r"))
@click.option("--output", default=os.sys.stdout, type=click.File("w"))
def cmd(redis_url, lua_file, output):
r = redis.StrictRedis.from_url(redis_url)
r.ping()
for k, v in scan_iter(r, lua_file.read()):
output.write(k.decode("utf-8"))
output.write("\n")
output.write("%d" % len(v))
output.write("\n")
if __name__ == "__main__":
cmd()
実行
$ pip install redis click
サンプルデータ投入
$ jq -n -r 'range(10000)|"set key\(.) value\(.)"' | redis-cli -n 8
ダンプしてみる
$ ./export.py --redis-url redis://localhost:6379/8
おわり。
Author And Source
この問題について(redis の db の中身をluaでダンプする), 我々は、より多くの情報をここで見つけました https://qiita.com/arc279/items/a8b1a5a7976e7b21859d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .