pythonでRedisの大量データからttl一覧を取得したい
Redisに大量のLaravelセッションがあるが、特定のキーパターンについてttl一覧を取得したい。。。
python分からないもぅマヂ無理。なので、↓のような感じで処理をする。
- scan パターン count=100とかでキー一覧をつくる
- キー一覧をfor分で回してttlを探す
キー一覧
scan
$ head laravel_session_list laravel:HogesjKCNLFusLnPbfiPk0ts7VOoxxEOuWyHogeo laravel:HogeXJm1eOUp9r1TUJffwOIC8ZeanCQNCpLHogeo laravel:Hogez8PBpIScAJEbEj5kmO69xImf5rOxiEBjHogeo
とりあえず、ハードコーディングでキーをセットしてttlを取ってみる
import sys import redis REDIS_HOST = len(sys.argv) > 1 and sys.argv[1] or '127.0.0.1' if __name__ == '__main__': r = redis.StrictRedis(host=REDIS_HOST, port=ぽーとばんごー) res_ttl = r.ttl('laravel:HogeTMuDXt7IsuncXtJTfujY8U9Hitg84vsHogeo') print(res_ttl)
redis-cliで引いてみる
$ redis-cli -h ${REDIS_HOST} -p ${ぽーとばんごー} ttl laravel:HogeTMuDXt7IsuncXtJTfujY8U9Hitg84vsHogeo (integer) 15431149
pythonで引いてみる
$ python36 get_ttl.py ${REDIS_HOST} 15431143
いけてそう。
for文でリストを回してみよう。
import sys import redis REDIS_HOST = len(sys.argv) > 1 and sys.argv[1] or '127.0.0.1' OUTPUT = 'laravel_session_list' if __name__ == '__main__': r = redis.StrictRedis(host=REDIS_HOST, port=ぽーとばんごー) with open(OUTPUT) as f: for key in f: res_ttl = r.ttl('key') # TTL print(key, str(res_ttl))
$ python36 get_ttl.py ${REDIS_HOST} laravel:HogesjKCNLFusLnPbfiPk0ts7VOoxxEOuWyHogeo -2 laravel:HogeXJm1eOUp9r1TUJffwOIC8ZeanCQNCpLHogeo -2 laravel:Hoge8PBpIScAJEbEj5kmO69xImf5rOxiEBjHogeo -2 laravel:HogewUfxMeBQy0LwegrvdEjLAfr6a4BX1y4Hogeo -2 laravel:HogeeuBdQkRGXNLConVcqom59Ha0782ID1OHogeo -2 laravel:HogeI3rIbkpkklmfxbG8RTbPyBiXloUsIl2Hogeo -2 laravel:HogeG9GHP7heioXpD4keWkG3HT3ZpXQ1iILHogeo -2 laravel:HogetvsL7yriP8r5v0H632Qm3SMKAxIJPzsHogeo -2 laravel:HogeHfAkYL5bFLfEUSFneGMfMdifbQYo4kZHogeo -2 laravel:Hoge1CEZuOeSuu3dwvO3iO6uPG6TvGR4lddHogeo -2
ふえぇ。。。なんかおかしい。。。もぅマヂ無理。
-2は存在しないキーを指定したときらしい。
$ redis-cli -h ${ホスト} -p ${ポート} ttl hogehoge (integer) -2
デバッガがほしい。
27.3. pdb — Python デバッガ — Python 3.6.5 ドキュメント
あった。
pdb.set_trace()をソース中に書くとそこで止まるらしい、使ってみよう。
res_ttl = r.ttl('key')の直後にブレークポイントを置いてみる。
import sys import redis ★import pdb REDIS_HOST = len(sys.argv) > 1 and sys.argv[1] or '127.0.0.1' OUTPUT = 'laravel_session_list' if __name__ == '__main__': r = redis.StrictRedis(host=REDIS_HOST, port=ぽーとばんごー) with open(OUTPUT) as f: for key in f: res_ttl = r.ttl('key') # TTL ★pdb.set_trace() print(key, str(res_ttl))
止まった。ので変数名とレスポンスの中身を覗いてみる。
$ python36 get_ttl.py ${REDIS_HOST} > /path/to/get_ttl.py(25)<module>() -> print(key, str(res_ttl)) (Pdb) print(key) laravel:HogesjKCNLFusLnPbfiPk0ts7VOoxxEOuWyHogeo (Pdb) print(res_ttl) -2
keyをprintしたときに改行コードがある、気がする。
rstripというもので改行コードを消せるらしい。
埋め込んでみる。
with open(OUTPUT) as f: for key in f: print('key(before rstrip): %s' % key) print('key(after rstrip): %s' % key.rstrip('\n'))
実行
$ python36 get_ttl.py
key(before rstrip): laravel:p4uLsjKCNLFusLnPbfiPk0ts7VOoxxEOuWyAfnpu
key(after rstrip): laravel:p4uLsjKCNLFusLnPbfiPk0ts7VOoxxEOuWyAfnpu
> /path/to/get_ttl.py(27)<module>()
できた。
これで、再度continueしながら検索してみる。
ソースはこんな
with open(OUTPUT) as f: for key in f: #print('key(before rstrip): %s' % key) #print('key(after rstrip): %s' % key.rstrip('\n')) res_ttl = r.ttl(key.rstrip('\n')) # TTL print(key, res_ttl) pdb.set_trace()
$ python36 get_ttl.py laravel:HogesjKCNLFusLnPbfiPk0ts7VOoxxEOuWyHogeo 624535 > /path/to/get_ttl.py(23)<module>() -> for key in f: (Pdb) continue laravel:HogeXJm1eOUp9r1TUJffwOIC8ZeanCQNCpLHogeo 7182184 > /path/to/get_ttl.py(23)<module>() -> for key in f: (Pdb)
別窓でredis-cliを引いてみる。
> ttl laravel:HogesjKCNLFusLnPbfiPk0ts7VOoxxEOuWyHogeo (integer) 624520 > ttl laravel:HogeXJm1eOUp9r1TUJffwOIC8ZeanCQNCpLHogeo (integer) 7182168
出来てそう。