hoge-hogeoのひきこもごも

インフラエンジニアだけど形を持ったインフラを触ったことがない人の徒然

pythonでRedisの大量データからttl一覧を取得したい

Redisに大量のLaravelセッションがあるが、特定のキーパターンについてttl一覧を取得したい。。。 

python分からないもぅマヂ無理。なので、↓のような感じで処理をする。

  • scan パターン count=100とかでキー一覧をつくる
  • キー一覧をfor分で回してttlを探す

キー一覧

scan

$ head laravel_session_list 
laravel:HogesjKCNLFusLnPbfiPk0ts7VOoxxEOuWyHogeo
laravel:HogeXJm1eOUp9r1TUJffwOIC8ZeanCQNCpLHogeo
laravel:Hogez8PBpIScAJEbEj5kmO69xImf5rOxiEBjHogeo

ttl取得py(get_ttl.py)

とりあえず、ハードコーディングでキーをセットして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というもので改行コードを消せるらしい。

www.lifewithpython.com

埋め込んでみる。

    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

出来てそう。