python のスクリプトから Redis サーバへ接続して操作する必要性に迫られ試してみました。
最初に候補として思い浮かんだのは以下の 2 つです。
Redisクライアントのコマンド実行
pythonのRedisモジュール
今回はどちらが使い勝手とパフォーマンスが良かったか紹介します。
Redisクライアント
既に OS に Redis クライアントが入っている場合は、redis-cli コマンドで Redis の操作ができます。
1 | $ redis-cli -h [ホスト] get "hoge" |
また、python から外部コマンドを実行する場合は subprocess を使うことで可能となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import subprocess try: args = [ "redis-cli", "-h", "localhost", "get", "hoge" ] result = subprocess.run( args, check = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True ) hoge = result.stdout except subprocess.CalledProcessError: raise Exception("get hoge failed.") |
しかし、外部プログラムを呼び出す場合はサブプロセスとなるので短時間に量が多くなるとリソース消費は多くなります。
よって、python の Redis モジュールを試してみました。
Redisモジュール
Redis モジュールを最初に使わなかったのはライブラリを探したりインストールする手間がもったいなかったからです。
インストールは pip コマンドを使います。
1 | $ pip install redis |
phpenv などの仮想環境を利用する場合は Pipfile などに定義して phpenv install または update ですね。
python から利用する場合は、以下のようなロジックになります。
1 2 3 4 5 6 | import redis connection = redis.StrictRedis(host = "localhost", port = 6379, db = 0) hoge1 = connection.get("hoge") print("hoge1 : " + hoge1) hoge2 = connection.lpop("hoge_list").decode('utf8') print("hoge2 : " + hoge2) |
get() の場合はそのまま文字列で取得できますが、リストの場合は lpop() や rpop() でバイト列が返ってくるので decode する必要があります。
また、パイプライン(pipeline)やコネクションプーリングももちろん使用できます。
まとめ
運用で redis-cli コマンドを使う機会がある場合はそちらの方が楽ですが、アプリから使う場合はやはり同じ言語のモジュールが最初の選択肢となります。
PHP なら phpredis ですし、AWS の ElastiCache の操作をする場合は AWS の SDK を使うケースも出てくるでしょう。
シェルスクリプトであれば redis-cli を使うのが楽ですが、python の場合はサブプロセスを実行する部分がオーバーヘッドとなるので python のモジュールが活用できるといいですね。
慣れない言語の場合は、ライブラリを探したり導入の手間を考えて身近な手法に逃げてしまいそうになりますが、時間があるときはじっくり調べたいですね。