hero_picture

Redisのインストールとちょっと使ったメモなど

2013/01/23

最近話題のRedisをさわってみました。

KVSとかNoSQLって呼ばれるRedisですが似たようなアプリケーションにMemcachedがあります。

Memcachedとの大きな違いとして

1)リスト型、集合型とかいろんなデータ構造が扱える

2)データの永続化ができる

3)レプリケーションができる

があるのではないかと思います。

速さは当然Memcachedが最高なんですが、それなりに高速で、しかも結構複雑なことができるようです。

インストール

インストールはここから。

http://redis.io/download

1cd /usr/local/src
2wgethttp://redis.googlecode.com/files/redis-2.6.9.tar.gz
3tar zxvf redis-2.6.9.tar.gz
4cd redis-2.6.9
5make test
6make
7make install
8

※make installするかどうかはお好みで。。

たくさんの環境にインストールしてみたんですが、環境によってはmake testでこんなエラーが。

1You need 'tclsh8.5' in order to run the Redis test
2

この場合は言われたとおり、以下のパッケージを入れると解決した。(debian)

1apt-get install tcl8.5
2

起動

1redis-server
2

これでサーバが起動します。デフォルトではポート6379。

なんか弁当箱みたいなんが出て、以下のような記述が出ればOK。

1[4350] 23 Jan 03:34:53.245 * The server is now ready to accept connections on port 6379
2

起動させたまま、別のターミナルでredis-cliを実行

1redis-cli

これでredisを操作できます。

地味にクライアント用プログラムがあるのはうれしいですね。

redis-cli < commands.txt こんな感じでコマンドを渡すこともできるようです。

生きてますかー?的なテスト

1redis127.0.0.1:6379>ping
2PONG
3

値を入れたりとってきたり。

1redis127.0.0.1:6379> set foo bar
2OK
3redis127.0.0.1:6379> get foo
4"bar"
5redis127.0.0.1:6379> quit
6

このように動作すればとりあえずインストールはOK

設定

展開したソースのredis.confが元になるので

これをコピーしておきます。

適当に/etc/に置くことにしました。

1cp redis.conf /etc/
2vi /etc/redis.conf
3

さまざまな設定項目がありますが、とりあえず現在は以下の項目を変更しました。

デーモンとして起動する。デバック中とか遊んでる途中ならnoでもいいと思います。

1daemonize no
23daemonize yes
4

メモリのダンプファイルを保存する場所。永続化はこのファイルが書き出されることで実現してます。

1dir ./
23/usr/local/redis/ (適当に)
4

使用するメモリサイズ。

1# maxmemory
23maxmemory 10240000 (適当に)
4

設定したconfを読み込んで起動。

このように設定ファイルを指定しないとデフォルト設定で立ち上がるので注意。

1redis-server /etc/redis.conf
2

いったん立ち上げたredis-serverを再起動すると設定が反映されます。

もうちょっとredis-cliを使ってみます

当然こちらを見るよりこ公式ドキュメントが非常に充実していますよ。

http://redis.io/commands

文字列型

これはさっきやりましたが。

1redis127.0.0.1:6379> set foo bar
2OK
3redis127.0.0.1:6379> sethoge hogehoge
4OK
5redis127.0.0.1:6379> get foo
6"bar"
7redis127.0.0.1:6379> gethoge
8"hogehoge"
9

削除

1redis127.0.0.1:6379> GEThoge
2"hogehoge"
3redis127.0.0.1:6379> DELhoge
4(integer) 1
5redis127.0.0.1:6379> GEThoge
6(nil)
7

参照

入ってるキーを一覧。

1redis127.0.0.1:6379> keys *
21) "foo"
32) "hoge"
4

こんな感じで正規表現っぽいキーのとり方もできました

1redis127.0.0.1:6379> keys f*
21) "foo"
3

インクリメント・デクリメント

1redis127.0.0.1:6379> GET count
2(nil)
3redis127.0.0.1:6379> INCR count
4(integer) 1
5redis127.0.0.1:6379> INCR count
6(integer) 2
7redis127.0.0.1:6379> INCR count
8(integer) 3
9redis127.0.0.1:6379> DECR count
10(integer) 2
11

リスト

リストの作成も出来ます。

1redis127.0.0.1:6379> LPUSH mylist "world"
2(integer) 1
3redis127.0.0.1:6379> LPUSH mylist "hello"
4(integer) 2
5redis127.0.0.1:6379> RPUSH mylist "!!"
6(integer) 3
7redis127.0.0.1:6379> LRANGE mylist 0 -1
81) "hello"
92) "world"
103) "!!"
11

セット型

文字列型の順不同の集合だそうで値の重複はできないという性質を持っているようです。

1redis127.0.0.1:6379> SADD myset "Hello"
2(integer) 1
3redis127.0.0.1:6379> SADD myset "World"
4(integer) 1
5redis127.0.0.1:6379> SMEMBERS myset
61) "World"
72) "Hello"
8redis127.0.0.1:6379> SADD myset "World"
9(integer) 0
10redis127.0.0.1:6379> SMEMBERS myset
111) "World"
122) "Hello"
13

こんな使い方もできるみたいです。

セット型のdiffをとる。

逆にするとenptyになっちゃうので渡すセット型の順番は重要です。

第一引数のセットが第二引数のセットと重複した場合消えて、残った文字列型が出力されます。

1redis127.0.0.1:6379> SMEMBERS myset
21) "World"
32) "Hello"
4redis127.0.0.1:6379> SMEMBERS myset2
51) "!!"
62) "World"
73) "Hello"
8redis127.0.0.1:6379> SDIFF myset2 myset
91) "!!"
10redis127.0.0.1:6379> SDIFF myset myset2
11(empty list or set)
12

ハッシュ

1redis127.0.0.1:6379> HSET myhash field1 "Hello"
2(integer) 1
3redis127.0.0.1:6379> HSET myhash field2 "World"
4(integer) 1
5redis127.0.0.1:6379> HGET myhash field2
6"World"
7redis127.0.0.1:6379> HGETALL myhash
81) "field1"
92) "Hello"
103) "field2"
114) "World"
12redis127.0.0.1:6379> HKEYS myhash
131) "field1"
142) "field2"
15redis127.0.0.1:6379> HVALS myhash
161) "Hello"
172) "World"
18

入ってるキーのタイプを取得

1redis127.0.0.1:6379> KEYS *
21) "myhash"
32) "count"
43) "myset"
54) "myset2"
65) "foo"
76) "mylist"
8redis127.0.0.1:6379> TYPE myhash
9hash
10redis127.0.0.1:6379> TYPE myset
11set
12redis127.0.0.1:6379> TYPE mylist
13list
14redis127.0.0.1:6379> TYPE foo
15string
16

タイムアウト

設定時間後に削除されるキー

以下の記述で5秒後消えるキーとして設定できる。

1redis127.0.0.1:6379> SEThoge hogehoge
2OK
3redis127.0.0.1:6379> EXPIREhoge 5
4(integer) 1
5redis127.0.0.1:6379> GEThoge
6"hogehoge"
7(5秒後)
8redis127.0.0.1:6379> GEThoge
9(nil)
10

DB切り替え

デフォルトでDBが0~15という名前で用意されていて切り替えて使用できる。

接続したときは必ず0を使うようになっているようです。

開発用データは0 本番は1 とかで使える!のかな?

1redis127.0.0.1:6379> SEThoge hogehoge
2OK
3redis127.0.0.1:6379> GEThoge
4"hogehoge"
5redis127.0.0.1:6379> SELECT 1
6OK
7redis127.0.0.1:6379[1]> GEThoge
8(nil)
9redis127.0.0.1:6379[1]> SELECT 0
10OK
11redis127.0.0.1:6379> GEThoge
12"hogehoge"
13

永続化のテスト

redisの目玉?機能にデータの永続化があります。

これは定期的にデータをファイルに書き出すことで実現しているようです。

redis.confの以下の記述がその設定内容だと思います。

1save 900 1
2save 300 10
3save 60 10000
4

15分間の間に1回更新があったらファイル書き出し

5分間の間に10回更新があったらファイル書き出し

1分間の間に10000回更新があったらファイル書き出し

って意味になるのかと。

しばらくredis-serverを起動してたら標準出力にこんなログがでました。

1[4390] 23 Jan 04:00:49.004 * DB saved on disk
2[4390] 23 Jan 04:00:49.004 *RDB: 0 MB of memory used by copy-on-write
3[4378] 23 Jan 04:00:49.015 * Background saving terminated with success
4

このタイミングでredis.confで指定した場所に指定したファイル名でダンプファイルを作成してくれてました。

この記述を見てから安心してサーバーを停止。

その後起動するとちゃんとデータは保存されてました。

(saveされてない常態で落とすと当然データは消えます)

このとき起動時には「読み込みました」的な以下のログがでてました。

1[4415] 23 Jan 04:31:32.445 * DB loaded from disk: 0.000 seconds
2

感想

機能としては「レプリケーション」や「アトミック実行」、「仮想メモリ」など

まだまだためしていないことがたくさんありますが、基本的な部分はさわれたかな、と思います。

なんだかとても見通しがよく感じて楽しく遊べました。

PHPやnode.js、rubyperlなどなど、いろんなクライアントから使用でき、

そのサンプルもよくみかけるので、ますます触りがいがありそうです。

redis client

http://redis.io/clients