Blog
ブログ

2023年7月24日

【PYTHON】PythonでRedisデータベースサーバーを操作してみましょう

皆さん、こんにちは。
23年新入社員のCです。
今回はPythonを使ってRedis DB Serverを操作する方法を詳しく解説します。

Redisは高速なデータベース管理システムであり、Pythonを使用して効率的に操作することができます。

今回の実装では、Ubuntu 22.04環境にRedis Serverをインストールし、サーバー側として動作させます。

一方、クライアント側はmacOS 11とPython 3.10の環境ではRedisライブラリをインストールし、クライアントとして動作させます。

 

サーバー側の設定

Terminalをあけ、次のコマンドを実行すると、Redisをインストールすることができます:

sudo apt update -y
sudo apt install curl -y
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update -y
sudo apt-get install redis -y

インストール後、動作確認するため、次のコマンドを実行します:

redis-cli ping

Terminal上でPONG が表示されたら成功です。


Redisのsystemd serviceを設定

Terminal上で実行します:

sudo nano /etc/systemd/system/redis.service

以下のコードを貼り付けます:

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
Type=forking
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target


Ctrl O→Enter→Ctrl Xの順番にキーを入力すると、ファイルが保存されます。その後、次のコマンドを実行します:

sudo systemctl enable /etc/systemd/system/redis.service
sudo systemctl start redis.service

Redisをシステムサービスとして起動します。

Redisに接続設定も必要なので、次のとおりを実行します:

sudo nano /etc/redis/redis.conf

Ctrl Wを押し、requirepassを入力、Enterを押して検索を行います。検索した画面がこちらです:

...省略...
# command, these will cause requirepass to be ignored.
#
# requirepass foobared

# New users are initialized with restrictive permissions by default, via the
...省略...

# requirepass foobaredの行とを削除します。
foobaredはデータベースにログインするパスワードです。

一旦パスワードを書き換えます。最後に、その行はこのような形になります。
requirepass sohobb2023

次に再度 Ctrl Wを押し、 protected-modeを入力し、Enterを押して検索します。
この設定でprotected-mode yesが見つかります。

yesからnoに書き換えますと、protected-mode noになります。

説明:
requirepassはデータベースにログインするためのパスワードを設定する
protected-modeは外部からの受信を可能に設定します。

また、Ctrl Wを押し、bind 127.0.0.1を入力、検索します。

検索された行の下に改行して、次の行を追加します:

bind 0.0.0.0

この行ではlocalhostをbindし、IPアドレス(ロカール)からアクセスができるようにしています。
保存するには、Ctrl O、Enter、Ctrl Xの順を押すと、設定ファイルが保存され、Terminalに戻ります。

次に、Redisが使うポートをファイアウォールに許可にします。

次のコマンドを実行します:

sudo ufw allow 6379/tcp           # Redisサーバーのデフォルトポート
sudo systemctl stop redis
sudo systemctl start redis                 # Redisサービスを再起動

データベースのロカールIPアドレスを取得する:

hostname -I

このIPアドレスに接続するとRedisデータベースを操作できます。
サーバー側の設定が終わりました。

次はクライアント側の設定になります。

 

クライアント側の設定

macOSのTerminalを開き、次のコマンドを実行すると、Python仮想環境を作成、Redisライブラリーをインストールすることができます:

mkdir redis-test/
cd redis-test/
python --version
# Python 3.10.11

pip install virtualenv # venv, redisをインストール
python -m virtualenv venv # venvを作成
source venv/bin/active # venvをアクティブ
pip install redis # redisライブラリーをインストール

実装
VS CodeでJupyter Notebookをインストールし、新規Notebookを作成:

ライブラリーをインポート:

import redis as rds

サーバーの設定:

# redisの設定
redis = rds.Redis(
    host="192.168.11.24",
    port=6379,
    password="sohobb2023",
    db=0
)

基本的な操作:

# redis dbに書き込む
# key : valueの形
set_result = redis.set('hoge', 'moge')
print(f'保存した結果:{set_result}')

# key nameのvalueを読み込む
get_result = redis.get('hoge')
print(f'取得した値:{get_result}')

実行した結果:

保存した結果:True
取得した値:b'moge'

JSONデータの操作:
ライブラリーをインポート:
import json

 

サンプルJSONデータ:

sample_data = {
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}

サンプルJSONデータをRedisに書き込み方:

# JSONデータからStringに変換
stringified_data = js.dumps(sample_data)

# key : value
key = 'sample_json_data'
value = stringified_data

# Redisに保存する
redis.set(key, value)

 

Redisに保存したデータを取得:

# Redisからデータを読みこむ
readed_data = redis.get(key)

print(readed_data)
print(type(readed_data))

実行した結果:

b'{"id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55, "batters": {"batter": [{"id": "1001", "type": "Regular"}, {"id": "1002", "type": "Chocolate"}, {"id": "1003", "type": "Blueberry"}, {"id": "1004", "type": "Devil\'s Food"}]}, "topping": [{"id": "5001", "type": "None"}, {"id": "5002", "type": "Glazed"}, {"id": "5005", "type": "Sugar"}, {"id": "5007", "type": "Powdered Sugar"}, {"id": "5006", "type": "Chocolate with Sprinkles"}, {"id": "5003", "type": "Chocolate"}, {"id": "5004", "type": "Maple"}]}'

<class 'bytes'>

読み込んだデータをJSONデータに戻す:

decoded_json_data = js.loads(readed_data)

decoded_json_data

実行した結果:

{'id': '0001',
'type': 'donut',
'name': 'Cake',
'ppu': 0.55,
'batters': {'batter': [{'id': '1001', 'type': 'Regular'},
{'id': '1002', 'type': 'Chocolate'},
{'id': '1003', 'type': 'Blueberry'},
{'id': '1004', 'type': "Devil's Food"}]},
'topping': [{'id': '5001', 'type': 'None'},
{'id': '5002', 'type': 'Glazed'},
{'id': '5005', 'type': 'Sugar'},
{'id': '5007', 'type': 'Powdered Sugar'},
{'id': '5006', 'type': 'Chocolate with Sprinkles'},
{'id': '5003', 'type': 'Chocolate'},
{'id': '5004', 'type': 'Maple'}]}

データ型の確認:

print(type(decoded_json_data))

実行した結果:

<class 'dict'>

まとめ

RedisをPythonで操作する手順を詳しく解説しました。これらのステップを理解することで、効率的にRedis DBを活用できるようになるでしょう。これらのステップを参考にして、Redisの理解をさらに深め、実際のプロジェクトや開発に役に立てていただけたらと思います。

長くなりましたが、最後まで本記事をご覧いただきありがとうございました。

このページの先頭へ