HYT MachineWorks

やったこととか思いついたことをメモしておくブログです。

WindowsでPythonからRedis(KVS)を使ってみる

Redisとは?

所謂、NoSQLの一種で、KVS(Key Value Store)と言われるタイプのデータベースです。

https://redis.io/

github.com

他にもKVSはいろいろあったんですが、Windowsで、Visual Studio Communityを使わないで導入することを考えるとRedisしか見つからなかったというのが正直なところ。

 Redisを導入する

公式では、バイナリが用意されていないのでMSのOpenProjectのGitHubサイトからDLする

github.com

ダウンロードは、上記サイトのリリースページからする。

現状、Stableは、3.0.504、リリースは、2016年と2年前だ、だけど、Redisサイトで

Redis 3.2 is the previous stable release. Does not include all the improvements in Redis 4.0 but is a very battle tested release, probably a good pick for critical applications while 4.0 matures more in the next months. 
See the release notes or download 3.2.11.

とのことなので、安定性重視と納得することにする。*1

インストール自体は、msiになっているからダウンロードしてダブルクリックすればOKな超簡単仕様。

勝手に、サービス化までやってくれる。

コマンドラインで、使う場合は、

>redis-cli

で、いろいろ操作できます。

こまかい使い方は、redisの薄い本を読むといいかも。

PythonからRedisを使う

PythonからRedisを使うには、redisをインストール

pypi.org

>conda install redis-py

>pip install redis

でインストール、condaの場合、

>conda install redis

をやるとredis自体が入ってしまって動かなくなるので注意

実際の使い方

使い方ですが、結構簡単で、接続したインスタンスを作成したらそれを使ってsetをすれば書き込めて、getをすると読み出せる感じです。

import random
import redis

# 読み込むデータを作る
write_dict = {str(i): i for i in range(100)}
key_list = list(write_dict)

# redisへ接続
pool = redis.ConnectionPool(host="localhost", port=6379, db=0)
r = redis.StrictRedis(connection_pool=pool)

# redisへ書き込む
for key in key_list:
r.set(key, write_dict[key])

# keyのリストの順番をシャッフル
random.shuffle(key_list)

# redisから読み出す
for key in key_list:
read_value = r.get(key).decode()
print(write_dict[key], read_value)

注意は、読み出したデータはバイト型で読み出されるのでデコードしてやる必要があるという事。

書き込むときに、リストとかいろいろredis自体は扱えるみたいだけどJSONに変換してテキストでやりとりした方が早くていいと思います。

import json
import redis

dict_data = {"key": {"a": "alphabet", "1-9": "Numeric"}}

# redisへ接続
pool = redis.ConnectionPool(host="localhost", port=6379, db=0)
r = redis.StrictRedis(connection_pool=pool)

# JSONでデータの読み書き
r.set("key", json.dumps(dict_data))
get_value = json.loads(r.get("key").decode())

print(type(get_value), get_value)

>>>> <class 'dict'> {'key': {'1-9': 'Numeric', 'a': 'alphabet'}}

そんな感じ。

感想

SQLの方が使いやすいなぁ。と思ってしまった。もうちょっと勉強が必要そうだ。

*1:上で言ってるのは、3.2のことで、3.0.504で、ふるいんだけど。まぁ、ぶっちゃけ、WSLを使えば最新のバージョンもつかえるんだろうけど気にしないことにする