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.16Pythonに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・プログラミングに関する相談・依頼はこちら 
													 
															 
															 
															 
															