俺です。
CacheStorageとしてよくつかうRedisですが、たまに中身をチェックしたい人生を迎えるときがあるとおもいます。
鼻ほじりながら keys *
したら早いけど非力なRedis君は音を上げてしまうかもしれませんし、
RedisCommandだけで頑張るのがしんどいときはRDBMSにぶちこむと捗るよというメモをのこします。
でもちょっとまってもしも俺がAthena玄人なら...
コネクタ使ったほうが楽そうです
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/athena-prebuilt-data-connectors-redis.html
以下人生を踏み倒したい俺向け
Redis
キー一覧を取得する
僕はkeys負荷死したくないので前者の手段を使います。
- ElatiCache RedisならSnapshotから複製して実行する
- ReadEndpointをアプリケーション側で参照してないならReadEndpointに実行でもいいかも
$ redis-cli -c -h hogefugare-dis.com --scan > keysfile
キーに登録されているTypeを取得する
- typeごとにMySQLに作るテーブル列を洗い出します
$ redis-cli -c -h hogefugare-dis.com
redis-cli> type <キー一覧取得で取得したキーいくつか指定>
Redisからキー指定でvalueを抽出する
- keyのtypeがhashだったときの例です。
- datetime型のvalueが含まれている場合はMySQLへ楽にLoadできるように取り出すタイミングで加工するのが楽ちんかと
- redis-cliは
--csv
オプションを使うとCSV形式で取得できるのが超よいですね - hgetallだとtypeとvalue両方出力されるのでhmgetでtype指定で抜きだします。hgetallの結果を加工してvalueだけのcsvファイルを作るもアリだとおもいます
- 1行ずつvalueを抽出するのは本当に遅いので並列実行がおすすめ
REDIS_HOST=hogefugare-dis.com
cat keysfile| while read KEY
do
result=$(redis-cli -c -h ${REDIS_HOST} --csv hmget ${KEY} hoge fuga ..取得したいtypeを並べるのです..)
echo "$result"
done > keydata.csv
MySQL
テーブル作成とデータロード
- typeにあわせてRDB側にテーブル作ります
CREATE TABLE hogehoge (
hoge int(11),
fuga varchar(768),
bar json
)
- データロード
LOAD DATA LOCAL INFILE 'keydata.csv' INTO TABLE hogehoge FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
データロード後煮るのも焼くのも好きにどうぞでレッツエンジョイ