Redis 文字列型と基本的な使い方

KVS型のNoSQLの中でも高速で人気の高いredisをpythonから使用する方法について学習します。

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の型について学習しましょう。