2023年7月24日
皆さん、こんにちは。
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'
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'>
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'>