初めまして、システムエンジニア新卒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(連想配列)

複数の文字列要素からなるデータ構造をバリューとして持つことができ,通常の文字列型のバリューと同じようにキーで参照することができます。

引用元:http://gihyo.jp/dev/feature/01/redis/0001

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

以下のような画面が出てサーバーが立ち上がったことが確認できます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-03-20-20-31

別のターミナルにて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;

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-06-21-39-21

ちゃんと返ってきていることがわかりました。

まとめ

Redisの環境構築と簡単な取り出しまでですが簡単に設定することが出来ました。

ただデータ構造が複雑でどの場面でどの構造を使うことができるかを知ることが大切であると感じました。

しかし、Redisを使うことができるとかなり高速なパフォーマンスを出すことができるので実際に多くのデータを使って試してみることが慣れるために必要だと思いました。

次回は実際にmysqlとの比較などをしてパフォーマンスの検証をしてみたいと思います。

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る