[Raspberry Pi OS]オフラインのRaspberry Pi ZeroでRedisをビルドする(Python)
はじめに
どーも。黒ヰ樹です。
長らくオフラインのRaspberry Pi ZeroにRaspberry Pi OSを入れて使用しており、今回Python標準ライブラリのSQLiteを使用してDB操作することに飽きたのでRedisをビルドして使ってみることにしました。
また今回はpiユーザーでサクッと始めたい人向けにsudo
コマンドを使用しない方法で紹介したいと思います。
下準備
Raspberry Pi Imagerを使用し最新のRaspberry Pi OSを入れておきます。
今回は少し古めのRaspberry Pi Zero WHと2021/10/30に公開されたばかりのDebian Bullseye版Raspberry Pi OS(Not Full版、現在のstable)を使用します。
様々な破壊的変更が行われている今回のOSですが、Debian Buster版とは異なりpython
コマンドで使えるPythonが3.9.2であることに注意が必要です。
Debian Buster版(現在のoldstable)で試す場合はpython
コマンドをpython3
コマンドに都度読み替えてください。
無事起動し終えてRaspberry Pi Configurationの設定をしたり、Wi-Fi切ったりBluetoothキーボード接続し終えたら、
Redisのtar.gz、redis-pyのtar.gz、お好みでhiredis-pyのtar.gzをUSBメモリに入れておき、
Raspberry Pi OSのホームディレクトリに出しておきます。
redis
download.redis.io
からダウンロードできるものを使用しています。
Redisのビルドに必要なコマンドはmake
のみです。
これだけでRedisのコマンドを使用できるようになります。
$ tar -xvzf redis-stable.tar.gz
$ cd redis-stable
$ make
Raspberry Pi Zero WHはスペックが低いのでビルドに時間がかかりますが適当に放置しておきましょう。
私は20分ぐらいかかりました。
ビルドに成功すると~/redis-stable/src
ディレクトリに6つの実行可能ファイルができます。
これらを実行するだけで使えます。簡単ですね。
$ ~/redis-stable/src/redis-server
$ ~/redis-stable/src/redis-sentinel
$ ~/redis-stable/src/redis-cli
$ ~/redis-stable/src/redis-benchmark
$ ~/redis-stable/src/redis-check-aof
$ ~/redis-stable/src/redis-check-rdb
Raspberry Pi OSではmakeとpkg-config、gccなどが最初から入っているのでオフラインでもRedisは問題なくビルドできます。
ちなみにAutotools(autoconf, automake, libtools)は入っていないので./configure
コマンド使うやつはオフラインでビルドできません。
phpあたりがそうです。
ちゃんとコマンドとして使用したい人はsudo make install
コマンドを使用しましょう。
コマンドがbinディレクトリに追加されてredis-server
やredis-cli
のような見慣れたコマンドが使えるようになります。
redis-server
redisのサーバー起動は~/redis-stable/src/redis-server
コマンドを叩くだけです。これで127.0.0.1:6379
からアクセスすることができます。
$ cd ..
$ ~/redis-stable/src/redis-server
今回はターミナルを複数開きRedisコマンドを叩いていきます。
Raspberry Pi OSをはじめとした大体のLinuxは/etc/hostsで127.0.0.1 = localhostの設定を最初からしてあるのでlocalhost:6379
からアクセスしてもいいです。
ターミナルを複数用意せずバックグラウンドで起動したままにしたい場合は~/redis-stable/src/redis-server --daemonize yes
コマンドを使用しましょう。
redis-cliからGETとかSETとか
~/redis-stable/src/redis-cli
コマンドを使用することで対話的にRedisコマンドを叩くことができます。
$ ~/redis-stable/src/redis-cli
INFO
コマンドを使えばredisやgccのバージョンを確認することができます。
redis-py
Download filesからダウンロードしたSourceを使用しています。
Pythonでパッケージを追加する場合、通常はpipを使用しオンラインで追加するのですが今回オフラインですのでそういったことはできません。
ですがPyPI登録パッケージに必ず含まれているsetup.pyを使用すると、python
コマンドからオフラインでもパッケージを追加することができます。
$ tar -xvzf redis-4.0.2.tar.gz
$ cd redis-4.0.2
$ python setup.py install --user
$ cd ..
これはsetuptoolsパッケージを使用していますが、pipについてくるパッケージなのでRaspberry Pi OSでは最初から入っています。
なんか非推奨パッケージ調べるにあたり通信を試みてエラー吐いていますが無視します。
また、ちゃんと追加したい場合はsudo python setup.py install
コマンドを使用しましょう。
全てのユーザーでパッケージが使えるようになるぐらいしか変わりませんが。
hiredis-py
Download filesからダウンロードしたSourceを使用しています。
$ tar -xvzf hiredis-2.0.0.tar.gz
$ cd hiredis-2.0.0
$ python setup.py install --user
$ cd ..
hiredis-pyはパッケージとして追加するだけでredis-pyが速くなります。
追加しなくてもredis-pyは使えますが、メリットしかないので是非追加しましょう。
pythonからGETとかSETとか
python
コマンドで使用できるREPLからredis-pyパッケージをインポートし対話的にRedisコマンドを入力したり、.pyファイルにコードを書きpython
コマンドから呼び出すことでRedisを使用することもできます。
$ python
スクリーンショット内のREPLではredis.Redis()
の引数を丁寧に書いてありますがデフォルト値がredis-serverをオプション無しで起動したものに合わせてあるので記述しなくても問題なく使えます。
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
# 上と同じ r = redis.Redis(host='127.0.0.1')
# または r = redis.Redis(host='localhost', port=6379, db=0)
# 上と同じ r = redis.Redis()
また、redis.Redis(decode_responses=True)
を使用するとRedisコマンドで返すバイト列を文字列に変換できます。
今回はpython
コマンドから対話的に使用してみましたがRaspberry Pi OS(Not Full版)であればオフラインでもvim, nano, Geany, Thonnyを使うことができるので簡単にPythonでRedisを使ったアプリケーションを開発できます。
おわりに
SQLiteのようにファイルを読み書きするのではなく、DBサーバーを立ち上げhostとportで接続することができるRedisは、Raspberry Pi OSに最初から入っているパッケージのおかげで例えオフラインのRaspberry Pi Zeroであっても簡単にビルドすることができます。
オフラインでできるメリットは様々なケースに応用できると思うので、使い道に困っているRaspberry Piで一度試してみてはいかがでしょうか。
記事書く予定は前からあったのですが今回分散型SNSやはてなブックマークで記事を見かけてRaspberry Pi Advent Calendar 2021に参加することにしました。
あまり接点ありませんがアドカレに快く参加させていただいたあっきぃさんありがとうございました。
Discussion