初めまして、システムエンジニア新卒1年目の菅原です。
今回は初めてredisを触ってみたので紹介します。
Redisに触れてみた背景
今年の9月半ばに職場の先輩たちとisucon6に参加しました。
残念ながら敗退してしまいましたが、これまでパフォーマンスをここまで意識したことはなく、参加チームの通過者や本戦出場者の中でもMysqlのデータをRedisに移行してパフォーマンスを速くしているチームが多い印象でした。
少し調べてみるとRDBMSのような複雑な処理にはRedisのキーバリューストア(KVS)型は向かないが、すべてのデータセットをメモリ内に読み込むため、とても高速で高いパフォーマンスをすることができることが分かりました。
パフォーマンスに問題があった場合Redisを使えることがパフォーマンスチューニングにおいては大切なことなのでそんなRedisを触らないわけにはいかないということで初めて触ってみました。
Redisの特徴
RedisとはREmote DIctionary Serverの略語であり、イタリアのSalvatore Sanfilippo氏が開発を創始したKey-Value型のNoSQLであります。
- インメモリベース
- すべてのデータがメモリ上に保持されるため,更新・参照が非常に高速です。
- 永続化
- インメモリの高速性を持ちながら,同時にディスクベース・データストアの永続性をも備えているのが特徴です。Redisの永続化機構は,定期的に(または更新回数などの条件により)メモリ上のデータセットのスナップショットをファイル(.rdb)にダンプし,再起動時にはこのスナップショットの内容をメモリに読み込むことにより,前回ダンプした状態までデータセットを復元します。
- 多彩なデータ構造
- String(文字列)
- List(連結リスト)
- Set(重複のない集合)
- Sorted Set(ソート済みのSET)
- Hash(連想配列)
複数の文字列要素からなるデータ構造をバリューとして持つことができ,通常の文字列型のバリューと同じようにキーで参照することができます。
Redisのインストール
今回の環境
- mac OS
- さくらVPS
- php5.3.3
使った環境はさくらVPS上でインストールしていきました。
ではインストールからしてみましょう。
$ wget http://redis.googlecode.com/files/redis-3.2.4.tar.gz $ tar zxvf redis-3.2.4.tar.gz $ cd redis-3.2.4 $ make $ sudo make install
上記コマンドでredisがインストールすることができました。
動作確認
では動作確認
$ redis-server
以下のような画面が出てサーバーが立ち上がったことが確認できます。
別のターミナルにてredis-cliが使えるか確認
$ redis 127.0.0.1:6379> ping PONG
pingと打てばPONGと返ってきます。これでサーバーが立ち上がっていることがわかります。
redis.conf 設定
$ sudo mkdir /etc/redis $ sudo cp redis-3.2.4/redis.conf /etc/redis/redis.conf
このときバックアップを念のためにとっておきましょう
このconfファイルを編集していきます。
sudo vim /etc/redis/redis.conf
デーモンの設定を有効にします。
#daemonize no ↓ daemonize yes
ログファイルの出力先を変更します。
#logfile stdout ↓ logfile /var/log/redis.log
サーバのログの情報量を設定します。
#loglevel verbose ↓ loglevel notice
サーバのログの情報量を設定します。
#loglevel verbose ↓ loglevel notice
メモリのダンプファイルを保存する場所を変更します。
dir ./ ↓ /usr/local/redis/
これでredisの設定ができましたので次は自動起動スクリプトを以下のように記述していきましょう
sudo vim /etc/init.d/redis
#!/bin/sh # chkconfig: - 85 15 # description: redis-server # processname: redis # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6379 EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac
以下コマンドで設定を反映します。
$ sudo chkconfig --add redis $ sudo chkconfig redis on
下記のようなレスポンスが返って来ると成功しています。
$ /sbin/chkconfig --list | grep redis redis 0:off 1:off 2:on 3:on 4:on 5:on 6:off
これでredisを扱う環境と簡単な設定ができました。
php 側から redis 動作確認
ではphp側から実際に軽く使ってみましょう
php側からredisを扱うことができるライブラリをインストール
$ sudo yum -y install php-pecl-redis --enablerepo=epel $ sudo service httpd restart
これでphp側からredisを扱うことができます。
では以下コードでちゃんと返答があることを確認してみましょう。
index.php
<?php $redis = new Redis(); $redis->connect("127.0.0.1",6379); // 値をセットする $redis->set('title', 'Redis触ってみました'); // 値を取得する $value = $redis->get('title'); // 表示 echo $value;
ちゃんと返ってきていることがわかりました。
まとめ
Redisの環境構築と簡単な取り出しまでですが簡単に設定することが出来ました。
ただデータ構造が複雑でどの場面でどの構造を使うことができるかを知ることが大切であると感じました。
しかし、Redisを使うことができるとかなり高速なパフォーマンスを出すことができるので実際に多くのデータを使って試してみることが慣れるために必要だと思いました。
次回は実際にmysqlとの比較などをしてパフォーマンスの検証をしてみたいと思います。