Redis はデータをメモリに置き、1 ミリ秒ほどで応答します。そのため、キャッシュ、キュー、セッションストアとして多くのアプリの裏側で使われています。インストールはコマンド 1 つです。手間がかかるのは既定の設定のほうで、メモリ上限がなく、スナップショットは直近の書き込みを失うことがあり、さらにデータを黙って消したりパスワードを無効にしたりする、ありがちなミスが 2 つあります。このガイドでは Ubuntu 24.04 でそのすべてを扱います。各手順は当社のイメージで実際に実行しており、数値は Micro サーバー(2 vCPU、2 GB)で測ったものです。
sudo を使えるユーザーが必要です。Ubuntu の初期設定ガイド で作成できます。
1. インストール
sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping
インストールは 13 秒で終わり、Redis 7.0.15 が入りました。すぐに起動し、起動のたびに自動で立ち上がり、PONG を返し、サーバー自身でのみ 待ち受けます。127.0.0.1:6379 と [::1]:6379 で、protected-mode yes です。データなしの状態で使用メモリは 13.5 MB でした。
ログにはすでに警告が出ていました。
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.
Redis は fork で作った自分のコピーからディスクに保存します。カーネルの既定設定では、メモリが少ないときにこの fork が失敗することがあります。一度だけ直しておきます。
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server
再起動後、警告は消えました。
2. メモリを制限する
初期状態では maxmemory は 0、つまり上限なしで、ポリシーは noeviction です。Redis はサーバーのメモリがなくなるまで使い続けます。上限を決め、達したときの動作を選びましょう。
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE
上限 64 MB、40 万回の書き込みで両方のポリシーを試しました。
noeviction(既定):メモリは 63 MB で止まり、新しい書き込みはOOM command not allowed when used memory > 'maxmemory'で失敗しました。キューや、失ってはならないデータに向いています。allkeys-lru:Redis は最も長く使われていないキーを 48,606 個捨て、書き込みはすべて通りました。キャッシュに向いています。
CONFIG REWRITE は実行中の設定を /etc/redis/redis.conf に保存するので、再起動後も残ります。ただし、手順 4 の前に知っておくべき行も追加されます。
3. ディスクへの保存方法を選ぶ
既定では、Redis は 1 時間に 1 回、5 分に 100 回、1 分に 1 万回の変更のいずれかでスナップショット(/var/lib/redis/dump.rdb)を書きます。止め方を 3 通り試しました。
| Redis の止まり方 | スナップショットのみ(既定) | AOF あり |
|---|---|---|
systemctl restart | 損失なし:停止時に保存する | 損失なし |
kill -9 で強制終了 | 最後のスナップショット以降のキーが消えた | 強制終了の 2 秒前に書いたキーが残っていた |
どちらの場合も、systemd が数秒で Redis を自動的に起動し直しました。
失って困るデータが Redis にあるなら、AOF(append-only file)を有効にしてください。すべての書き込みを記録し、1 秒に 1 回ディスクに書き出します。ファイルを編集するのではなく、稼働中のサーバーで設定してください。
redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_
最初は別のやり方を試し、データを失いました。redis.conf の appendonly no を appendonly yes に書き換えて再起動したところ、Redis は空の AOF で起動し、スナップショットから何も読み込まなかったため、既存のキーはすべて消えました。さらに次に停止したとき、古いキーを含まない新しい内容で dump.rdb まで上書きしました。CONFIG SET ならこれを避けられます。Redis はまずメモリ上のデータから AOF を書き出すからです。再起動後もキーはすべて残っていました。
Redis が空から始まっても困らない純粋なキャッシュなら、逆に redis-cli CONFIG SET save "" で保存を止めましょう。
4. パスワードを設定する
2 つ目の落とし穴です。CONFIG REWRITE を一度でも実行すると、Redis 7 は redis.conf の末尾に次の行を追加します。
user default on nopass ~* &* +@all
これは「既定ユーザーにパスワードは不要」という意味です。そのあとファイルの上のほうに requirepass を書き足して再起動しましたが、Redis はパスワードなしで PONG を返し続けました。user の行が優先されるためです。パスワードは Redis 経由で設定してください。
REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE
パスワードは安全な場所に保存してください。Redis は今、同じ user default の行に SHA-256 ハッシュとして保存しています。再起動後、redis-cli ping は NOAUTH Authentication required. を返し、パスワードを渡したときだけ通りました。redis-cli には REDISCLI_AUTH 変数で渡します。-a を使うとプロセス一覧に表示され、redis-cli も警告を出します。アプリでは Redis の URL に含めます:redis://:PASSWORD@127.0.0.1:6379/0。
5. 手元のコンピューターから接続する
Redis は 127.0.0.1 のままにして、SSH トンネルを使います。サーバーの SSH ポートを指定してください。NAT プランでは個別に割り当てられたポートです。
ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22
これを動かしている間、手元の redis-cli -p 6380 やデスクトップツールがサーバーの Redis とやり取りします。インターネットに新しく開くものは何もありません。SSH 鍵のガイド を使えば、トンネルはパスワードなしでログインできます。
速度
Micro のテストサーバーで、50 クライアントの redis-benchmark の結果です。
| テスト | 毎秒リクエスト数 | レイテンシ中央値 |
|---|---|---|
| SET | 30,303 | 1.0 ms |
| GET | 35,149 | 0.9 ms |
| SET、1 往復あたり 16 コマンド | 272,109 | 2.4 ms |
| GET、1 往復あたり 16 コマンド | 414,938 | 1.3 ms |
Web アプリのキャッシュやジョブキューには、必要な量をはるかに超えています。速度の上乗せは、コマンドをまとめて送る(パイプライン)ことで得られています。
どのプランを選ぶか
Redis に必要なのはデータ用の RAM で、それ以外はほとんど要りません。Nano(2 vCPU、1 GB、月 $3)なら maxmemory 256mb で小さなアプリと並べて Redis を動かせます。Micro(2 GB、月 $5)なら、より大きなキャッシュとアプリの両方に余裕があります。ほかのマシンから Redis に直接つなぐ必要があるなら、専用 IPv4(Nano-IP、月 $8 から)を使い、ファイアウォール でそのアドレスだけを許可してください。全プランは VPS ページにあり、支払いは Base、Ethereum、Polygon 上の USDT、USDC、ETH です。
コメント
まだコメントはありません。最初になりましょう。