Redis のインストール

Redis を使う機会がありそうなので、事前に試す。 Redis 本体と適当なクライアント(今回は c)を入れて、動かしてみる。

インストール手順

使用環境:Ubuntu 13.10

apt-get コマンドでインストールできる。

$ sudo apt-get install redis-server
Reading package lists... Done  
Building dependency tree  
Reading state information... Done  
The following packages were automatically installed and are no longer required:  
  libc-ares2 libv8-3.14.5
Use 'apt-get autoremove' to remove them.  
The following extra packages will be installed:  
  libjemalloc1
The following NEW packages will be installed:  
  libjemalloc1 redis-server
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.  
Need to get 475 kB of archives.  
After this operation, 1,151 kB of additional disk space will be used.  
Do you want to continue [Y/n]? y  
Get:1 http://us.archive.ubuntu.com/ubuntu/ saucy/universe libjemalloc1 amd64 3.3.1-1 [93.0 kB]  
Get:2 http://us.archive.ubuntu.com/ubuntu/ saucy/universe redis-server amd64 2:2.6.13-1 [382 kB]  
Fetched 475 kB in 2s (168 kB/s)  
Selecting previously unselected package libjemalloc1.  
(Reading database ... 223519 files and directories currently installed.)
Unpacking libjemalloc1 (from .../libjemalloc1_3.3.1-1_amd64.deb) ...  
Selecting previously unselected package redis-server.  
Unpacking redis-server (from .../redis-server_2%3a2.6.13-1_amd64.deb) ...  
Processing triggers for ureadahead ...  
ureadahead will be reprofiled on next reboot  
Processing triggers for man-db ...  
Setting up libjemalloc1 (3.3.1-1) ...  
Setting up redis-server (2:2.6.13-1) ...  
Starting redis-server: redis-server.  
Processing triggers for libc-bin ...  
Processing triggers for ureadahead ...  

とりあえず起動してみる。

$ redis-server --port 12345
[4187] 05 Apr 22:38:03.979 # Unable to set the max number of files limit to 10032 (Operation not permitted), setting the max clients configuration to 3984.
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 2.6.13 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 12345
 |    `-._   `._    /     _.-'    |     PID: 4187
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

[4187] 05 Apr 22:38:03.979 # Server started, Redis version 2.6.13
[4187] 05 Apr 22:38:03.980 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[4187] 05 Apr 22:38:03.980 * The server is now ready to accept connections on port 12345

起動できるのが確認できた。

c client の導入

公式サイトの client 一覧から適当な c のクライアントを入れて使ってみる。 今回は公式 c クライアントらしい、hiredisを選択する.

# git が入っていない場合は以下のコマンドで git をインストール
$ sudo apt-get install git

# github 上のリポジトリを clone する
$ git clone https://github.com/redis/hiredis.git
Cloning into 'hiredis'...  
remote: Reusing existing pack: 2172, done.  
remote: Total 2172 (delta 0), reused 0 (delta 0)  
Receiving objects: 100% (2172/2172), 717.79 KiB | 314.00 KiB/s, done.  
Resolving deltas: 100% (1248/1248), done.  
Checking connectivity... done

# インストール
$ cd hiredis
$ sudo make install
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  net.c  
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  hiredis.c  
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  sds.c  
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  async.c  
cc -shared -Wl,-soname,libhiredis.so.0.10 -o libhiredis.so  net.o hiredis.o sds.o async.o  
ar rcs libhiredis.a net.o hiredis.o sds.o async.o  
mkdir -p /usr/local/include/hiredis /usr/local/lib  
cp -a hiredis.h async.h adapters /usr/local/include/hiredis  
cp -a libhiredis.so /usr/local/lib/libhiredis.so.0.10  
cd /usr/local/lib && ln -sf libhiredis.so.0.10 libhiredis.so.0  
cd /usr/local/lib && ln -sf libhiredis.so.0 libhiredis.so  
cp -a libhiredis.a /usr/local/lib  

リポジトリ内にあるサンプルが付属しているので、実行してみる。

# サンプルディレクトリに移動
$ cd examples

# コンパイル
$ gcc example.c -I /usr/local/include/hiredis/ -l hiredis

# redis server の起動
$ redis-server --port 12345 &
[2] 7939

# 実行(1回目)
$ ./a.out 127.0.0.1 12345
PING: PONG  
SET: OK  
SET (binary API): OK  
GET foo: Hello world  
INCR counter: 1  
INCR counter: 2  
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
0) element-9  
1) element-8  
2) element-7  
3) element-6  
4) element-5  
5) element-4  
6) element-3  
7) element-2  
8) element-1  
9) element-0  
# 実行(2回目)
$ ./a.out 127.0.0.1 12345
PING: PONG  
SET: OK  
SET (binary API): OK  
GET foo: Hello world  
INCR counter: 3  
INCR counter: 4  
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
0) element-9  
1) element-8  
2) element-7  
3) element-6  
4) element-5  
5) element-4  
6) element-3  
7) element-2  
8) element-1  
9) element-0  

INCR counter でインクリメントしている部分が1回目と2回目できちんと増加しているのがわかる。

次に、一度 redis server を終了させてからもう一度起動させ、同様に実行してみる。

# 正しい終了方法がわからなかったので、とりあえずプロセス kill で代用
$ kill -9 7939

# redis server を終了させた状態でサンプルを実行
$ ./a.out 127.0.0.1 12345
Connection error: Connection refused  
[2]-  Killed                  redis-server --port 12345
$ ./a.out 127.0.0.1 12345
Connection error: Connection refused

# redis server を再度起動
$ redis-server --port 12345 &
[2] 7957

# サンプルをもう一度実行してみる
$ ./a.out 127.0.0.1 12345
PING: PONG  
SET: OK  
SET (binary API): OK  
GET foo: Hello world  
INCR counter: 1  
INCR counter: 2  
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
: (null)
0) element-9  
1) element-8  
2) element-7  
3) element-6  
4) element-5  
5) element-4  
6) element-3  
7) element-2  
8) element-1  
9) element-0  

redis server 再度起動後にサンプルを実行すると、(当たり前だが)きちんと counter の値が初期化されていることがわかる。