Redisチートシート(導入編)

- 1. 導入編
- [2. コマンド編](http://qiita.com/morrr/items/3639f549dcf33992c851)
- [3. 設定編](http://qiita.com/morrr/items/26dbdd87df03315fa680)


概要
------------------------------------------------------------
- Redis = NoSQLデータベースの一種
    - 実装はC
    - BSDライセンス

- `REmote DIctionary Server`の略で、ネットワーク越しにKVSとして使うことを前提とする

- オンメモリで動作するが、HDDに保持して永続化することも可能
    - 高頻度のKVのみ、あるいはキーのみをオンメモリに配置できる



バージョン比較
------------------------------------------------------------

バージョン      | リリース時期  | 主な変更点
---             | ---           | ---
2.0             | 2010/09       | 仮想メモリ対応
2.2             | 2011/02       | 効率向上
2.4             | 2012/10       | 仮想メモリ機能を非推奨化
2.6             | 2012/10       | 仮想メモリ機能を除去, Lua eval, 接続上限数の撤廃
3.0             | 2015/04       | クラスタリング対応
3.2             | 2016/05       | BITFIELD, GEO API


導入
------------------------------------------------------------

OSXの場合はbrewでインストールできる。

```bash:OSX
$ brew update
$ brew install redis
$ redis-server -v
>Redis server v=3.2.8 sha=00000000:0 malloc=libc bits=64 build=1d731032efdfe68c
```

RH系(CentOS 6.x)の場合はyumに存在しなかったのでビルドした。


```bash:RH(CentOS6.x)
$ sudo yum update
$ sudo yum upgrade
$ sudo yum install gcc* tcl
$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xzf redis-stable.tar.gz
$ cd redis-stable
$ sudo make
$ sudo make install
$ redis-server -v
>Redis server v=3.2.8 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=26e8ec75e44c781d
```

さらに、Redisをサービスとして常駐させたい場合は`install_server.sh`を実行する。
対話形式によってそれ用のファイル/ディレクトリが作成される。


```bash:RH(CentOS6.x)
$ ./utils/install_server.sh 

>Welcome to the redis service installer
>This script will help you easily set up a running redis server
>
>Please select the redis port for this instance: [6379] 
>Selecting default: 6379
>Please select the redis config file name [/etc/redis/6379.conf] 
>Selected default - /etc/redis/6379.conf
>Please select the redis log file name [/var/log/redis_6379.log] 
>Selected default - /var/log/redis_6379.log
>Please select the data directory for this instance [/var/lib/redis/6379] 
>Selected default - /var/lib/redis/6379
>Please select the redis executable path [/usr/local/bin/redis-server] 
>Selected config:
>Port           : 6379
>Config file    : /etc/redis/6379.conf
>Log file       : /var/log/redis_6379.log
>Data dir       : /var/lib/redis/6379
>Executable     : /usr/local/bin/redis-server
>Cli Executable : /usr/local/bin/redis-cli
>Is this ok? Then press ENTER to go on or Ctrl-C to abort.
>Copied /tmp/6379.conf => /etc/init.d/redis_6379
>Installing service...
>Successfully added to chkconfig!
>Successfully added to runlevels 345!
>Starting Redis server...
>Installation successful!
```


コマンドの構成
------------------------------------------------------------

Redisは機能によって復数のコマンドを使いわける。

- `redis-server` = Redis自身(サーバ)の操作
- `redis-sentinel` = 監視とフェールオーバ機能
- `redis-cli` = CLIクライアント
- `redis-benchmark` = パフォーマンス計測
- `redis-check-aof`, `redis-check-dump` = データファイルの破損時に利用


起動
------------------------------------------------------------

### サーバを起動する
`redis-server` コマンドでサーバを操作する。
redisがフォアグラウンドで起動し、バージョン情報やポート番号などが表示された後、ログが流れる。

```bash
$ redis-server
```

また起動時には設定ファイルを指定できる。

```bash
$ redis-server /path/to/config.conf
```


#### デーモンとして起動する

デフォルトではフォアグラウンドで動作するので、デーモンとして起動したい場合は`--daemonize`オプションを指定する。

```bash
$ redis-server --daemonize yes
$ ps aux | grep redis
>root     23618  3.1  0.7 133544  7520 ?        Ssl  23:26   0:00 redis-server *:6379         
```


導入時に`install_server.sh`を実行するなどしてサービス登録が済んでいる場合は、`service`等で制御できる。

```bash:RH(CentOS6.x)
$ service redis_6379 start
$ service redis_6379 stop
```


接続
------------------------------------------------------------

### クライアントから接続する
`redis-cli`コマンドで、クライアントを起動する。
単に`redis-cli`を実行すると、ローカルのRedisサーバに接続する。

```bash
$ redis-cli
```

また`ping`オプションで、接続の可否を確認できる。

```bash
$ redis-cli ping
> PONG
```

### 接続時のオプション

`redis-cli -h` でオプションを一覧できる。

以下、利用頻度の高そうなものを抜粋。

オプション      | 内容              | デフォルト
---             | ---               | ---
-h              | オプション一覧    | -
-v              | バージョン表示    | -
-h <hostname>   | ホスト名指定      | localhost
-p <port>       | ポート番号指定    | 6379
-a <password>   | パスワード指定    | -
--raw           | マルチバイト許可  | -
--rdb <filename>| .rdb取得          | -


### デバッグ用オプション

オプション          | 内容
---                 | ---
--latency           | レイテンシを表示
--latency-history   | レイテンシを堆積表示
--slave             | マスタサーバからのコマンドを表示


データ構造等
------------------------------------------------------------

### キーについて

キーは文字列としてRedisに登録される。
命名に関しての制約は非常にゆるい様子で、具体的な制限を示した資料は見つからなかった。


たとえば試した限りでは以下のような文字が使えた:

- 空白(`SET 'a b c' 'foo'`)
- 予約語(`SET 'SET' 'foo'`)
- 特殊文字(`SET '!@#$%^&*()-+|~{}[];:\'",.<>/?' 'foo'`)
- マルチバイト文字(`SET あああ 'foo'`)


文化的には、キー名をドメインごとにコロン `:` で区切って表現するルールを採用している例が多いようだった。

```
SET some:service:some:user:id:123 '999'
```

なおキーについて大文字小文字は区別__される__。


### 値について

値として以下の型が使える:

- 文字列
- リスト = 配列
- セット = リストと異なり順序を保持せず、要素の重複を許容しない
- ソート済みセット = セットとしての特性に加え、インデックスを設定できる
- ハッシュ = 連想配列


Redisはドキュメント指向DBでは__ない__ため、データ構造を入れ子にすることは__できない__。
複雑なデータを格納したい場合はJSONなどをシリアライズして格納することになる(アンチパターン？)。


また値ではなくコマンドの戻り値として、integer, error, nil などが存在する。

## 参考
- [Wikipedia - Redis](https://ja.wikipedia.org/wiki/Redis)
- [OSDN Magazine](https://mag.osdn.jp/)

- [Redis(公式)](https://redis.io/)
    - [Redis Quick Start](https://redis.io/topics/quickstart)

- [How to install Redis 3.x on new CentOS 6.6 server](https://www.openprogrammer.info/2015/05/10/how-to-install-redis-3-x-on-new-centos-6-6-server/)
- [Stack overflow - How to keep redis server running](http://stackoverflow.com/questions/14816892/how-to-keep-redis-server-running)

***
[コマンド編](http://qiita.com/morrr/items/3639f549dcf33992c851)に続く