Redisとは?入門するときに知りたいこと。

Redisとは、読み方は「レディース」。超高速なメモリDBで知られています。「入門するときに知りたいこと」をテーマに、Redisのインストール方法、各種言語のプログラムとの連携方法での扱い方など入門知識をまとめています。

目次

0. 読み方は「レディース」

Redisの入門の第一歩は読み方と思います。Redisの読み方は「レディース」です(笑)。

一番初め周囲から聞いたとき、Redisのスペルがわからなくて、レディースと検索して探すのに苦労しましたので、読み方はレディースと強調してみました。これでレディースと検索した人がRedisのスペルにたどりつけられればいいなと思います。

ちなみに、人によっては「レディス」と伸ばさない読み方もあります。入門当初から周囲ではみんな「レディース」といっていたので「レディース」を押しています。Nginxを「エンジンエックス」と読むように実際の読み方はスペルから少し違うパターンと思っています。

1. Redisとは

Redisとは、超高速なメモリDBで知られてる通り、用途にもよりますが、RDBと比較すると比べにもならないほど速いです。高速な楽観的なトランザクションというイメージのデータベースです。

Pipeline機能やプーリングでさらに高速化したり、レプリケーションしたり、Redis Sentinelで監視・自動切替などが行えます。

2. インストール方法

Redisの入門ということで、Redisとは?に触れましたが、次にインストール方法についてみていきます。

2.1. CentOS7にRedisをインストール(ソースコンパイル)

以下は、CentOS7(64bit)、gcc 4.8.5の環境にRedis-3.2.3をインストールする例です。

環境

  • Redis-3.2.3
  • CentOS7(64bit)
  • gcc 4.8.5

gcc、make、wgetのインストール

この手順では、gcc、make、wgetを使用しますので、インストールされていない場合はインストールします。

# yum -y install gcc make wget

インストール媒体のダウンロード

Redisのインストール媒体をダウンロードして、アーカイブを解凍します。

$ wget http://download.redis.io/releases/redis-3.2.3.tar.gz
$ tar xzf redis-3.2.3.tar.gz

なお、Redisの最新版は「http://redis.io/download」で確認できます。

makeを実行

本環境の場合は、そのままmakeを実行すればOKです!Makefileの修正は不要です。

$ cd redis-3.2.3
$ make

実行

redis-serverを&を付けて、バックグラウンドで起動します。

$ src/redis-server &

redis-cliでコマンドを実行します。

$ src/redis-cli
redis 127.0.0.1:6379> set foo bar
OK
redis 127.0.0.1:6379> get foo
"bar"
redis 127.0.0.1:6379> exit
$

2.2. CentOS7にRedisをインストール(yum)

上記では、ソースをコンパイルしてインストールしましたが、yumを使ってインストールした方が楽です。ここでは、CentOS7にyumを使用してRedisをインストールし、サービスの自動起動設定まで行う手順を見ていきます。

EPELとREMIのインストール

そのままだと古いRedisがインストールされてしまいますので、EPELとREMIのインストールを行います。

# yum install epel-release
# wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# sudo rpm -Uvh remi-release-7*.rpm

Redisのインストール

Redisをyumでインストールします。

# yum --enablerepo=remi,remi-test,epel install redis

インストール確認。2016年9月現在では3.2.3がインストールされました。

# redis-cli -v
redis-cli 3.2.3

サービス自動起動の設定

サービス自動起動の設定を行います。

# systemctl enable redis.service

Redisの起動

Redisを起動します。

# systemctl start redis.service

2.3. WindowsにRedisをインストール

このページでは、CentOS7(64bit)、gcc 4.8.5の環境にRedis-3.2.3をインストールする例です。

環境

  • Redis-3.2.100
  • Windows 8

Windows版の媒体をダウンロード

https://github.com/MSOpenTech/redis/releasesより、実行ファイル作成済みの媒体がダウンロードできます。

今回は「Redis-x64-3.2.100.zip」をダウンロードしました。

インストール

インストールはzipファイルを解凍して、任意の場所に配置すれば使用できます。

実行

Redis Servverは、コマンドプロンプトあるいはredis-server.exeをダブルクリックして起動できます。

redis-server-windows-x64

Redisクライアントも同様にコマンドプロンプトあるいはredis-cli.exeをダブルクリックして起動できます。

redis-cli-windows-x64

3. プログラムとの連携方法

Redisをどの言語のアプリケーションと連携しますでしょうか?言語を選んで入門知識が試せるよう、各種言語用のドライバーを使用して、各種言語と連携する方法をまとめていきます。

3.1. JavaでRedisを利用する方法

前提として、Javaの入門知識がないと使えません。説明を理解するにはEclipseやmevenの知識も必要です。

以下は、RedisのJavaクライアントライブラリ(Jedis)の使用方法をまとめています。

Jedisとは

JedisはRedisクライアント機能が利用できるJavaのライブラリです。

ダウンロード先

Jedisは「https://github.com/xetorthio/jedis」からダウンロードできます。

mevenリポジトリ

mavenのpom.xmlの指定は以下です。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.1</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

サンプル

以下では、Jedisを使用いて、Redisと連携するJavaの入門プログラムを作成して実行してみます。

package sample;

import redis.clients.jedis.Jedis;

public class Sample {

	public static void main(String[] args) {
		Jedis jedis = new Jedis("127.0.0.1", 6379, 1000);
		jedis.connect();
		jedis.set("message", "Hello World!!");
		String value = jedis.get("message");
		jedis.disconnect();
		System.out.println("value=" + value);
	}
}

実行すると「value=Hello World!!」と標準出力されます。

3.2. PHPでRedisを利用する方法

PHPもレンタルサーバで対応しているところは見たことがないので、前提としてテスト用のものでもLinuxサーバなど、サーバをある程度セットアップできる知識が必要です。上述のRedisのインストールが行えれば十分です。

php-pecl-redisのインストール

php-pecl-redisを使用いて、Redisと連携するPHPの入門プログラムを作成して実行してみます。
インストールはyumでインストールします。

# yum -y install php-pecl-redis

Redisと連携するPHPの入門プログラムを作成して実行してみます。
RedisサーバーとPHPサーバーが別サーバーの場合は、pconnect()の引数をRedisサーバーのIPアドレスに変更してください。

<?php
$redis = new Redis();
$connected = $redis->pconnect('127.0.0.1');
$redis->set('foo', 'bar');
print_r($redis->get('foo'));

3.3. PythonでRedisを利用する方法

PythonでRedisを利用する方法をまとめています。前提として、「Pythonのインストールおよび基礎知識」が必要になります。また、本記事ではPython3を前提に記述しています。

Python redis-pyのインストール

Python用のRedisドライバはPythonのパッケージインストールツールのpipから行えます。pipは、Python3の場合標準でインストールされるツールになります。

pip install redis

早速、RedisをPythonで操作してみます。

PythonでRedisに接続

import redis
con = redis.Redis(host='localhost', port=6379, db=0)

PythonでRedisにset型データ追加

con.set('aaa','bbb')

PythonでRedisのset型のデータ取得

con.get('aaa')

PythonでRedisのデータ一覧取得

con.keys()

4. Redisの入門時に知っておきたいセキュリティ観点

Redisの入門時に知っておきたいセキュリティ観点をまとめていきます。

4.1. Redisを標的としたアクセスに注意

Redisはデフォルトでは、ローカルからのみアクセス可能な設定ですが、外部からアクセスできるように変更する場合は注意が必要です。インターネットに接続から接続される可能性がないかなど十分に配慮が必要です。警察庁によるとRedisを狙ったアクセスも観測されているとのことです。

参考)https://www.npa.go.jp/cyberpolice/detect/pdf/20160113.pdf

リモート接続でRedisにアクセスする場合は以下は考慮したいです。

  • 特定のサーバからのみアクセスできるようにIP制限する
  • パスワード認証も行うようにする
  • Redisはrootで起動しない

4.2. NoSQLインジェクションに注意

RedisはNoSQLなのでSQLインジェクションにはあいませんが、NoSQLインジェクションが行われます。入力値のサニタイズ(無毒化)処理は必須です。

5.まとめ

上述で見てきた範囲ですが、Redisの入門知識をまとめます。

Redisとは

Redisとは、超高速なメモリDBで知られてるNoSQLのデータベースです。

各種OS、言語で利用できる

今回インストールを紹介したようにLinuxやWindowsで利用できました。FreeBDSなど他もあります。言語はJava、PHP、Pythonを見てきましたが、他にも対応しています。

セキュリティ面に注意

Redisも当然セキュリティ面の注意が必要です。特に外部からのアクセス、入力チェックの不備は実際に不正アクセスの被害を耳にします。

今のところ以上ですが、今後また追記していきます。

参考)RedisでPHP7+OPCache+APCu環境のWordPressよりも3倍以上高速化する方法

WordPressは、PHPの速度がサーバサイドの大半を占め、PHPの速度がものをいいます。PHP5をそのまま使うとかなり遅いです。PHP7+OPCache+APCuにするとかなり高速化されるのですが、Redisを使用することでさらに3倍以上も高速化されます。

e-algoritym.xyzのWordPressページで試したところ、サンプル数:50ページの平均値で、PHP5.6の環境の場合、サーバサイドの速度が、0.5358秒かかりました。速度は、Navigation Timing APIのRequestの値になります。

PHP7+OPCache+APCuにすると平均で0.0844秒、PHP5.6と比べると6.3倍高速化されました。記述量が少ないページは0.07秒ほどでした。

そして、PHP7+OPCache+APCu+Redisにすると平均で0.0239秒、PHP5.6の22.4倍、PHP7+OPCache+APCuの3.5倍、記述量が少ないページは0.008秒程度、記述が少ないとPHP7+OPCache+APCuの10倍近く、サーバーサイドが高速化されました。

RedisとWordPressの連携

それでは、RedisとWordPressを連携する方法を見ていきます。ここでは、jeedo.net(http://www.jeedo.net/lightning-fast-wordpress-with-nginx-redis/)のコードを使用して連携していきます。

連携の仕組み

連携の仕組みは、初回はMySQLからPHP7+OPCache+APCuで表示します。その際にページをRedisにキャッシュして、それ以降、Redisからページデータを取得してリクエストを返すという簡単な仕組みです。

導入方法

WordPressの呼び出し口のindex.phpをRedisにキャッシュするPHPファイルに置き換えるだけで簡単に導入できます。

WordPressサイトのルートにあるindex.phpをhttp://www.jeedo.net/downloads/wp-index-redis.zipのコードに置き換えて、http://uploads.staticjw.com/ji/jim/predis.phpを同じ階層に配置します。

wp-index-redis.phpがindex.phpになりますが、コード内のwp-blog-header.phpを読み込む部分のパスの記述は環境に合わせてパスを修正する必要があります。

注意点

ページがキャッシュされるわけですので、キャッシュされてほしくないページがキャッシュされないか十分に検証が必要です。

更新履歴

  • 2016年11月22日 Redisの入門時に知っておきたいセキュリティ観点について追記しました。
  • 2016年09月21日 RedisでPHP7+OPCache+APCu環境のWordPressよりも3倍以上高速化する方法について追記しました。
  • 2016年09月14日 Redisとは何かの説明を追記しました。
  • 2016年09月13日 PythonでRedisを利用する方法について追記しました。
  • 2016年08月09日 記事を作成しました。

SNSでもご購読できます。