はじめに

こんにちは、プロダクツ本部 プロダクツエンジニアグループ ビジネスアプリケーションチームのNTです。

世間ではCentOSの方針変更でざわつきそろそろ各社も今後のサーバーOSをどうするか、という問題の解決策を見出してきたと思います。その中でも比較的CentOSの移行先の候補として多く上がっているであろうAlmaLinuxにインメモリデータベース「Redis」をインストールし、使ってみようと思います。Redisはインメモリデータベースの中でもまたシェア率が高いと思いますので、この組み合わせは結構多い組み合わせなんじゃないかなと思います。

構築環境

今回使用する環境は、以下の通りとなります。

  • AlmaLinux 8.7 (Stone Smilodon)
  • Redis 5

AlmaLinuxについてはバージョン9が出ていますが、まだ動作確認ができていないので今回は8系の最新版の8.7にしました。またRedisもバージョン7が最新となっています。

Redisのインストール

まずはRedisをインストールしてみます、今回はRHEL8系から追加されたdnfコマンドの機能の一つであるmoduleを使ってRedisをインストールします。

dnf module

 dnf module list redis

このコマンドにより、通常のdnfや前身のyumと違い、同じパッケージであっても違うバージョンのストリームを選択することができるので、特定のバージョンのパッケージをインストールしたいといった場合にはとても便利です。

AlmaLinux 8 - AppStream
Name Stream Profiles Summary
redis 5 [d] common [d] Redis persistent key-value database
redis 6 common [d] Redis persistent key-value database

実行結果はこの様になりました。Streamの列を見てみると5と6が選択できる様ですが、デフォルトは5になっているので、ひとまずはこのままデフォルトに任せます。

dnf install -y @redis

いつものコマンドでインストールを開始しますが、パッケージ名の先頭に@を付けておきます。

インストール自体はこれだけで完了なので、続いてRedisの設定ファイルを編集してみます。

/etc/redis.conf

Redisの設定ファイルは/etc/redis.confにありますので、これを使用する環境に合わせて編集しておきます。余談ですが私はテキストエディタにnanoを使っています、vimよりも直感的で煩わしい操作も不要なので、おすすめです。

大事な項目は以下の設定となります、とりあえず以下の項目をそれぞれ設定しておけば良いかなと思っています。

  • maxmemory (使用する最大メモリ容量)
  • bind (0.0.0.0にするとどこからでもアクセス可能、環境によりけり)
  • port (普通はそのままでOK)
  • daemonize (yesにするとデーモンとして起動する)
  • loglevel/logfile (ログ出力設定)
  • save ~ (永続化の為の設定、永続化しないなら不要)
  • requirepass (Redisに接続して操作に必要なパス設定、無難に入れておいた方がいいです)

動作させる環境だったり使用する条件でそれぞれの項目は変わるので一概には言えないですが、少なくともmaxmemory、daemonize、loglevel/logfile、requirepassの設定は確認した方が良いと思います。特にmaxmemoryはサーバーの物理メモリを超えないように注意です。

起動する

設定が無事完了したらRedisを起動してみます。先にRedisの自動起動設定を有効にしてから、systemctlで起動させます。

systemctl enable redis
systemctl start redis

エラーが吐かれていないかをチェックし、問題なければ無事構築完了です。

Redisを使ってみる

ここからは実際に簡単ではありますがRedisを操作してみます。Redisはコンソール上で操作する場合redis-cliというクライアントツールが用意されているので、これを使います。

接続と認証

redis-cli

クライアントからの接続が成功すると「127.0.0.1:6379>」という表示が出ますが、ここで各コマンドを使用してデータベースを操作します。

ただし、前述した設定ファイル内でrequirepassを指定している場合はそのままコマンドを打っても怒られますので、先に設定したパスワードで認証を済ませておきます。

127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH (設定したパスワード)
OK
127.0.0.1:6379> keys *
(empty list or set)

「keys *」で全てのキーを表示しようとしていますが、認証を済ませていないのでエラーが出ていますね。認証を行う場合には「AUTH (設定したパスワード)」を先に送信してからになります。今回はまだ何も値を入れていないので、emptyと返ってきています。

ちなみに、コマンドは大文字と小文字を区別しないのでKEYSでもkeysでもどちらでも大丈夫です。

DB切り替えと値のセット

早速実際に値を入れてみますが、先に使用するDBの選択を済ませておきます。DBはMySQLで言う所のスキーマに該当しますが、デフォルトでは0~15の16個のDBを切り替えることができます。

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)

初期では0番目のDBに接続されていますが、select 1と打つことで1番目のDBに切り替えられます。今どのDBを参照しているかはポート番号の右に表示される[n]の箇所で判断できます。

では簡単な値をセットしてみます、一般的なKeyValue型の値を入れる場合は「SET key value」の形で値を入れられます。

127.0.0.1:6379> set test 1
OK
127.0.0.1:6379> keys *
1) "test"

今回はtestというkey名でvalueに1を指定してみました。値をセットした後に全てのキーの一覧を表示すると、先程登録したtestが出てきますね。

実際に業務で使用するパターンを考えてみると、キーの有効期限を指定して登録する機会の方が多いと思います。その場合どうするかと言うと、SETEXを使用します。

127.0.0.1:6379> setex test2 60 1
OK
127.0.0.1:6379> keys *
1) "test2"
2) "test
127.0.0.1:6379> ttl test2
(integer) 50

SETEXを使う場合はkey名の後に秒数指定が入ります、この場合は60秒の有効期限を設けていることになりますね。その後で「TTL test2」を投げていますが、これは残りの有効期限を表示するものとなります。

ちなみに、有効期限を指定していないキーでTTLを投げると、有効期限の残り秒数が-1と出ます。

さて、1分以上経過した状態で再度keys *を投げてキーの一覧を取得してみます。

127.0.0.1:6379> keys *
1) "test"

追加したtest2のキーが消えている事がわかります、有効期限を60秒としたので登録から1分が経過したことによりキーが自動的に削除されました。

Redisを使って高速なシステム構築を

以上で簡単にはなりますが、AlmaLinux8上でRedisのインストールから設定、実際に動かすまでの一連の流れになります。Redisは設定もシンプルな部類に入ると思うので、導入がしやすいですし、実際の運用でもMySQL等とは違い良い意味で機能が限られているので操作も簡単です。

システムを構築する際には常に速度を意識しますが、コードやMySQLだけの工夫ではどうしようもない場合も発生します。そんな時にはRedisを使ってキャッシュをさせたりで爆速なシステムを簡単に構築できるので、速度をより意識するシステムにはかなり有用な手段です。