Chromebookは軽くて便利なノートパソコンですが、PythonとRedisを使ってキャッシュサーバーを作ることができることをご存知でしたか?
この記事では、ChromebookでPythonとRedisを使ってキャッシュサーバーを作る方法を丁寧に解説します。Redisのインストールや設定、コマンドラインやPythonからの操作方法など、初心者でもわかりやすいように説明します。
また、Redisを使ってじゃんけんゲームを作るサンプルコードもありますので、楽しみながら学ぶことができます。
目次
①Redisのインストールと設定
Redisを使うには、まずRedisサーバーをインストールして起動し、Pythonから接続するためにredis-pyというクライアントライブラリをインストールする必要があります。
Chromebook のLinux開発環境のターミナルから下記コマンドを実行することでRedisサーバーをインストールすることができます。
sudo apt update
sudo apt install redis
インストール後下記コマンドを実行することでバージョンが確認できます。
redis-cli -v
# redis-cli 6.0.16
Pythonにredis-pyをインストールするには、pipというパッケージ管理ツールを使います。コマンドプロンプトやターミナルで以下のコマンドを実行してください。
pip install redis
これでredis-pyというクライアントライブラリがインストールされます。
ちなみに、PythonのプログラムからRedisにアクセスするには、以下のようにインポートして使います。
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
r.get('foo')
②Redisの起動・状態確認・停止・再起動・ログ確認
Redisの起動を管理するコマンドになります。
Redisサーバーのポート番号がデフォルトの6379であることなどに注意する必要があります。
# 起動
sudo systemctl start redis-server
# 状態確認
sudo systemctl status redis-server
# 停止
sudo systemctl stop redis-server
# 再起動
sudo systemctl restart redis-server
# 起動・停止ログの確認
sudo journalctl -r -u redis-server
③Redisで扱えるデータ型やコマンド
Redisは、文字列、リスト、ハッシュ、セット、ソート済みセットという5種類のデータ型を持ち、それぞれに対応するコマンドを使って操作します。
例えば、文字列型の値を設定するにはSETコマンドを、取得するにはGETコマンドを使います。
# ログイン
redis-cli -p 6379
# {key}というキーで{val}という値を登録
set {key} {val}
# {key}に設定されている値を取得
get {key}
# キーの確認
keys *
# キーをすべてクリア
flushdb
# 特定のキーを指定して削除する
del {keyname}
# ログアウト
quit
④Pythonからの使用方法(簡単サンプルコード)
PythonからRedisにアクセスするには、redis-pyというクライアントライブラリを使います。このライブラリは、Redisサーバーに接続するためのRedisクラスや、Redisコマンドを呼び出すためのメソッドを提供します。
例えば、文字列型の値を設定するにはsetメソッドを、取得するにはgetメソッドを使います。
また、redis-pyではすべてのレスポンスがバイト列として返されるため、文字列として扱いたい場合はdecodeメソッドでデコードする必要があります。
ChromebookにPython開発環境を構築後、下記を実行ください。
import redis
# Redis に接続します
# Redisサーバーのホスト名, ポート番号, データベース番号 を指定します
redis = redis.Redis(host='localhost', port=6379, db=0)
# 'key' というキーで 'val' という値を追加します
redis.set('key', 'val')
# 追加した値を取得して表示します
redis_test = redis.get('key')
print(redis_test.decode())
⑤Redisを使ったじゃんけんゲームのサンプルコード
# redis-pyをインポート
import redis
# ランダムな数値を生成するためにrandomモジュールをインポート
import random
# Redisサーバーに接続
r = redis.Redis(host='localhost', port=6379, db=0)
# RestFlag
YES = "Y"
NO = "N"
# じゃんけんの手を表す定数
ROCK = 1 # グー
PAPER = 2 # パー
SCISSORS = 3 # チョキ
# じゃんけんの手と文字列の対応表を辞書で定義
HANDS = {
ROCK: 'グー',
PAPER: 'パー',
SCISSORS: 'チョキ'
}
# じゃんけんの結果を表す定数
WIN = 1 # 勝ち
LOSE = -1 # 負け
DRAW = 0 # あいこ
# じゃんけんの結果と文字列の対応表を辞書で定義
RESULTS = {
WIN: '勝ち',
LOSE: '負け',
DRAW: 'あいこ'
}
# じゃんけんの勝敗判定を行う関数
def judge(player, computer):
# 引き分けの場合
if player == computer:
return DRAW
# プレイヤーが勝つ場合
elif (player == ROCK and computer == SCISSORS) or \
(player == PAPER and computer == ROCK) or \
(player == SCISSORS and computer == PAPER):
return WIN
# プレイヤーが負ける場合
else:
return LOSE
# int型判定をする関数
def is_int(value):
# 引数が int 型の場合は True を返す
if isinstance(value, int):
return True
# 引数が str 型の場合は、int 関数で変換してみてエラーが発生しなければ True を返す
elif isinstance(value, str):
try:
int(value)
return True
except ValueError:
return False
# それ以外の型の場合は False を返す
else:
return False
# メイン処理
def main():
# 繰り返しプレイするかどうかを表すフラグ
replay = True
while replay:
while replay:
# Rest
Rest = input('対戦結果をクリアしますか?([Y]:Yes、[N]:No)')
# 入力値が不正な場合はやり直し
if Rest not in (YES, NO):
print('->不正な入力です')
continue
if Rest == YES:
r.set('play_count',0)
r.set('win_count',0)
print('->対戦結果をクリアしました')
else:
print('->対戦結果を引き継ぎました')
break
player = 99
while replay:
# プレイヤーの手を入力させる
_player = input('じゃんけんの手を入力してください(1:グー、2:パー、3:チョキ):')
# 入力値が不正な場合はやり直し
if is_int(_player):
player = int(_player)
else:
print('->不正な入力です')
continue
player = int(_player)
if player not in (ROCK, PAPER, SCISSORS):
print('->不正な入力です')
continue
break
# コンピュータの手をランダムに決める
computer = random.randint(1, 3)
# 両者の手を表示する
print(f' あなたの手は {HANDS[player]} です')
print(f' コンピュータの手は {HANDS[computer]} です')
# 勝敗判定を行う
result = judge(player, computer)
# 結果を表示する
print(f' ★★結果は{RESULTS[result]}です★★')
# Redisにプレイ回数と勝ち数をカウントアップする
r.incr('play_count') # プレイ回数を1増やす
if result == WIN:
r.incr('win_count') # 勝ち数を1増やす
# Redisからプレイ回数と勝ち数を取得する
play_count = int(r.get('play_count'))
if r.get('win_count') != None:
win_count = int(r.get('win_count'))
else:
win_count = 0
# 勝率を計算する(プレイ回数が0の場合は0とする)
win_rate = win_count / play_count if play_count > 0 else 0
# プレイ回数と勝ち数と勝率を表示する
print(f' -----------------')
print(f' プレイ回数:{play_count}回')
print(f' 勝ち数:{win_count}回')
print(f' 勝率:{win_rate*100}%')
print(f' -----------------')
# Rest
while replay:
_continue = input('対戦を継続しますか?([Y]:Yes、[N]:No)')
# 入力値が不正な場合は終了
if _continue not in (YES, NO):
print('->不正な入力です')
continue
if _continue == NO:
replay = False
break
if __name__ == '__main__':
# メイン処理実行
main()
まとめ
本記事では、ChromebookにRedisをインストールしてPython からキャッシュサーバーとして使用する方法を紹介しました。
ご参考になりましたら twitter をフォローして SNS でシェアして頂ければ幸いです。
IT・プログラミングに関する相談・依頼はこちら