KVS型のNoSQLの中でも高速で人気の高いredisをpythonから使用する方法について学習します。
Contents
Redisとは
RedisとはKVSの一種で、メモリ上で動作するため非常に高速であることが特徴的です。一方でディスクに書き込むことも可能ですので古いデータを残したりマシンやコンテナを再起動することができます。
また、単純なKVSではなくリストや辞書に似たデータ型をもちます。Pythonのデータ型に近いため、Pythonと相性が良いといえるでしょう。
基本的な使い方
クライアントのセットアップ
(※サーバー側は既に用意されている、という前提で進めます。セットアップについては説明を省略しますので公式ページ等をご参照ください。)
pythonのredisクライアントのインストールはpipで行います。
pip install redis
全てのコマンドについては説明できませんのが、基本的にはRedisコマンドを小文字にしたものがメソッドとして提供されています。以降文字列型について説明しますが、Redisコマンドの詳細は以下ドキュメントを参考にしてください。
http://redis.shibu.jp/commandreference/strings.html
使ってみる
それではさっそく使ってみましょう。redisにStrictRedisで接続後、setでデータを格納、getでデータを取得してみます。Redis側でサポートされている型は文字列型となります。
import redis # redisに接続する。ホスト、ポート、db番号を指定する r = redis.StrictRedis(host='localhost', port=6379, db=0) # キーと値をセットする r.set('key01', 'aaaa') # セットした値を取得する v = r.get('key01') # 文字列型に変換する v_str = v.decode() # 削除する r.delete('key01')
redis.StrictRedisでredisに接続できます。引数でホスト、ポート、db番号を指定することができますが、ローカルホストでデフォルトポート番号の場合は引数を省略することもできます。
データをセットする場合はsetメソッドでキーと値を指定します。
getメソッドでキーを指定すると、セットした値を取得することができます。また、取得できる値はbytes型なので、必要に応じて型変換をしましょう。
指定したキーが存在しない場合はNoneが返されます。
また、削除する場合はdeleteでキーを指定します。
色々なメソッド
set/get/deleteでほぼ事足りると思いますが、それ以外にも以下のようなメソッドが用意されています。
setnx キーが登録されていなければset
既にキーがある状態でsetすると上書きされますが、それで不都合がある場合はsetnxを使用してみましょう。
r.set('key01', 'aaaa') r.setnx('key01', 'bbbb') r.get('key01') # b'aaaa' r.setnx('key02', 'bbbb') r.get('key02') # b'bbbb'
キーが既にある場合は上書きされず、ない場合は新たにセットされていることが確認できます。
getset 取得と同時にセットする
情報にステータスのようなものを持たせたい場合に便利なのがgetsetです。取得と同時に値の設定をすることができます。
r.set('status', '未処理') val = r.getset('status', '処理中') r.get('status').decode() # 処理中
mset/mget 複数のキーを同時に扱う
データが大量にある場合、ループで回しても良いのですが、mset、mgetメソッドを使用すると同時に設定、取得を行うことができます。
r.mset({'key01': 'aaa' , 'key02': 'bbb' , 'key03':'ccc'}) r.mget(['key01', 'key02', 'key03']) # [b'aaa', b'bbb', b'ccc']
incr/decr インクリメント、デクリメントする
足し算、引き算という簡単な計算でわざわざget/setするのは面倒ですが、incr/decrメソッドを使用するとそういった手間を省くことができます。
r.set('num', 100) r.incr('num', 1) # 101 r.decr('num', 2) # 99
上のサンプルでは1を足した後2を引き算しています。オンラインゲームのスコアなんかに使えますね。
Redisの型について
上で扱った文字列や数値と行った単一の値以外にlistやsetを使用することができます。次回からはredisの型について学習しましょう。