🎄

[Raspberry Pi OS]オフラインのRaspberry Pi ZeroでRedisをビルドする(Python)

2021/12/12に公開

はじめに

どーも。黒ヰ樹です。
長らくオフラインの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のホームディレクトリに出しておきます。

pi

redis

https://redis.io/topics/quickstart

download.redis.ioからダウンロードできるものを使用しています。

Redisのビルドに必要なコマンドはmakeのみです。
これだけでRedisのコマンドを使用できるようになります。

$ tar -xvzf redis-stable.tar.gz
$ cd redis-stable
$ make

Raspberry Pi Zero WHはスペックが低いのでビルドに時間がかかりますが適当に放置しておきましょう。

redis01

redis02

redis03

私は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-serverredis-cliのような見慣れたコマンドが使えるようになります。

redis-server

redisのサーバー起動は~/redis-stable/src/redis-serverコマンドを叩くだけです。これで127.0.0.1:6379からアクセスすることができます。

$ cd ..
$ ~/redis-stable/src/redis-server

今回はターミナルを複数開きRedisコマンドを叩いていきます。

redis04

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

redis05

INFOコマンドを使えばredisやgccのバージョンを確認することができます。

redis-py

https://pypi.org/project/redis/

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では最初から入っています。

redispy01

redispy02

なんか非推奨パッケージ調べるにあたり通信を試みてエラー吐いていますが無視します。

また、ちゃんと追加したい場合はsudo python setup.py installコマンドを使用しましょう。
全てのユーザーでパッケージが使えるようになるぐらいしか変わりませんが。

hiredis-py

https://pypi.org/project/hiredis/

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が速くなります。

hiredispy01

hiredispy02

追加しなくてもredis-pyは使えますが、メリットしかないので是非追加しましょう。

pythonからGETとかSETとか

pythonコマンドで使用できるREPLからredis-pyパッケージをインポートし対話的にRedisコマンドを入力したり、.pyファイルにコードを書きpythonコマンドから呼び出すことでRedisを使用することもできます。

$ python

py

スクリーンショット内の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に参加することにしました。
あまり接点ありませんがアドカレに快く参加させていただいたあっきぃさんありがとうございました。

https://akkiesoft.hatenablog.jp/

Discussion