こんにちは、鈴木です。
最近、 KVS (Key Value Store) の一つである Redis を使い始めました。
KVS では memcached が有名ですが、それと比較してデータ型が豊富である点や、データの永続化をサポートしている点が Redis の特徴です。
Redis のインストール
現時点で Redis の最新版は 2.6.x ですが、手元の環境でパッケージからインストールしたところ 2.4 系統が入ってしまいました。
最新版を使ってみたかったので、ソースからインストールしました。
まず公式サイトからソースコードをダウンロードし、展開します。
1 2 3 4 |
cd /usr/local/src sudo wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz sudo tar xvfo redis-2.6.12.tar.gz cd redis-2.6.12 |
次に make します。
1 2 3 4 5 6 7 8 9 |
sudo make # 32-bit モードでコンパイルする場合. # sudo make 32bit # 環境変数 MALLOC でメモリアロケータを変更可能. # (Linux 環境のデフォルトは jemalloc) # make MALLOC=libc # make MALLOC=jemalloc |
そして make install します。
1 2 3 4 |
sudo make install # 環境変数 PREFIX でインストール先を指定可能. # sudo make PREFIX=/usr/local/redis-2.6.12 install |
最後に、起動スクリプトや設定ファイルの作成など、運用に必要なファイルを作成します。
これを行うには、utils ディレクトリにある install_server.sh を使用すれば OK です。
1 2 3 |
# utils ディレクトリに移動しないと install_server.sh は上手く動きませんでした. cd utils sudo ./install_server.sh |
install_server.sh を実行すると、以下のように必要な情報を聞かれますので、順番に答えていきましょう。
1 2 3 4 5 6 7 8 9 |
Please select the redis port for this instance: [6379] Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379 Please select the redis executable path [] /usr/local/bin/redis-server |
これで Redis のインストールは完了です。
Redis を複数起動したい場合(例えばデータを永続化しない設定と永続化する設定それぞれを起動したい場合)は install_server.sh を複数回実行します(当然ですが、指定するパラメータは変える必要があります)。
Redis の起動と終了
以下のように起動します。
1 |
sudo /etc/init.d/redis_6379 start |
終了は次のとおりです。
1 |
sudo /etc/init.d/redis_6379 stop |
redis-cli で接続する
Redis に接続するには redis-cli を使用します。
1 |
$ redis-cli |
引数を指定せずに実行すると、ローカルホストの 6379 ポートに接続します。(-h で接続先ホスト、-p でポート番号を指定できます。その他オプションについては「redis-cli --help」で確認できます)
それではいくつか簡単なオペレーションを行なってみましょう。
まずは生存確認です。PING コマンドを実行します。問題無ければ「PONG」と返してくれます。
1 2 |
redis 127.0.0.1:6379> PING PONG |
次は値の設定です。SET コマンドで count というキーに 1 という値を設定します。
1 2 |
redis 127.0.0.1:6379> SET count 1 OK |
設定した値は GET コマンドで取得します。
1 2 |
redis 127.0.0.1:6379> GET count "1" |
INCR コマンドを使用すると、値をインクリメントすることができます。
1 2 |
redis 127.0.0.1:6379> INCR count (integer) 2 |
先程 1 を設定したので、インクリメントして 2 になるはずです。レスポンスからも値が 2 になったと読み取れます。
値の削除は DEL コマンドで行います。
1 2 |
redis 127.0.0.1:6379> DEL count (integer) 1 |
レスポンスの 1 は「1 件削除しました」という意味です。(DEL コマンドには削除対象のキーを複数渡すことができ、存在しないキーは単純に無視されます。)
削除したキーを GET してみます。
1 2 |
redis 127.0.0.1:6379> GET count (nil) |
結果は「(nil)」となります。
Ruby から Redis を使う
Ruby から Redis を扱うためのライブラリはいくつかありますが、今回は公式サイトで紹介されていた redis (redis-rb) を使用します。
また、redis (redis-rb) のドキュメントで紹介されていた hiredis (hiredis-rb) も導入します(hiredis (hiredis-rb) を導入すると、特に大きいサイズのレズポンスのパースが高速化されるそうです)。
それぞれインストールするには、
コンソールで以下のコマンドを実行するか、
1 |
gem install redis hiredis |
bundler を使用しているのであれば Gemfile に以下を追加してから「bundle install」します。
1 2 |
gem 'redis', '~> 3.0.1' gem 'hiredis', '~> 0.4.5' |
サンプルコードです。
値の設定、取得、削除は以下のように行います。
1 2 3 4 5 6 7 8 9 10 |
require 'redis' require 'hiredis' redis = Redis.new(driver: :hiredis) redis.set(:count, 1) # => "OK" redis.get(:count) # => "1" redis.incr(:count) # => 2 redis.del(:count) # => 1 redis.get(:count) # => nil |
メソッド名と引数は Redis のコマンドに合わせてあるようです。
Redis の設定
Redis を前述の install_server.sh を用いてデフォルトの設定で作成した場合、設定ファイルは /etc/redis/6379.conf に作成されます。
設定項目はいくつもありますが、設定ファイルの中を見ると、
- サーバ全体の設定
- スナップショットの設定(SNAPSHOTTING)
- レプリケーションの設定(REPLICATION)
- セキュリティの設定(SECURITY)
- リソースの上限設定(LIMITS)
- Append Only File の設定(APPEND ONLY MODE)
- 組み込み言語 LUA によるスクリプティングの設定(LUA SCRIPTING)
- スローログの設定(SLOW LOG)
- その他の設定(ADVANCED CONFIG)
- 設定ファイルのインクルード設定(INCLUDES)
という順番で記述されています。
設定項目はいくつもありますので、まずはサーバ全体の設定から最初に確認しておいたほうが良さそうなものをピックアップします。
daemonize
yes を指定するとデーモンとして実行されるようになります。
port
TCP 接続を受け付けるポート番号を指定します。install_server.sh でインストールした場合は、その時に入力したポート番号が設定されているはずです。
0 を指定すると TCP 接続は受け付けないようになりますので、Unix ドメインソケットのみで接続するという場合は 0 を指定します。
bind
TCP 接続を受け付けるインタフェースを指定します。
ローカルからしか接続しない場合は 127.0.0.1 を指定すると良いでしょう。
省略するとどこからでも接続することができるので、別サーバにレプリケーションする場合などは省略することになると思います。
細かい設定を行ないたい場合は、iptables など別のレイヤーで制限をかければ良さそうです。
unixsocket, unixsocketperm
Unix ドメインソケットでの接続を受け付けたい場合に設定します。
unixsocket でソケットファイルのパス(/tmp/redis.sock など)、unixsocketperm でファイルに設定するパーミッション(755 など)を指定します。
databases
事前に準備しておくデータベースの数を指定します。
Redis ではデータベースを複数持つことができ、0 から順番に番号が付けられています。
これによって、異なる用途のデータは異なる番号のデータベースに保存することができるため、非常に便利です。
まとめ
今回は Redis を導入して使い始めるまでを一通り見てきました。
次回以降はバックアップやレプリケーションなどポイントを絞って調べていこうと思います。