Chromebook で Redis を使った Python キャッシュサーバーの作り方と注意点

7 min

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
sudo systemctl status 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・プログラミングに関する相談・依頼はこちら
広告_零号機-エリア2
kewton

kewton

大学院卒業後、某大手SIerで10年以上SEとして従事。
社会人3年目までに基本情報・応用情報技術者、データベーススペシャリスト、簿記3級・2級を取得。
基幹系システム・IoTシステム開発のプロジェクト経験多数。AI活用システムの企画・プロト開発経験あり。
強みは、プロマネだけでなく自身で開発も実施してきたこと。
【扱える言語】
C#、java、python、javascript、Excel VBA
【扱えるDB】
oracle、sql server、postgreSQL、mongoDB

FOLLOW

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA