Redis

## Redis サーバーの制御

```
127.0.0.1:6379> info
# Server
redis_version:5.0.6
redis_git_sha1:0
redis_git_dirty:0
・・・

# 接続中のクライアント一覧を表示する
127.0.0.1:6379> client list 

# 接続中のクライアント接続を切断する
127.0.0.1:6379> client kill 10.0.0.8:33333 

# コマンド起動後に受信したリクエストを全てダンプする
127.0.0.1:6379> monitor 
OK
```

## キー操作

### Basic
```
# キーに値をセットする
127.0.0.1:6379> set key01 value01 
OK

# キーの値を参照する
127.0.0.1:6379> get key01 
"value01"

# キーを削除する
127.0.0.1:6379> del key01 
(integer) 1

# キー一覧
127.0.0.1:6379> keys *

# キーが存在するか確認する (1なら真)
127.0.0.1:6379> exists key01 
(integer) 1

# キーがすでに存在しない場合のみデータをセットする
# 結果が 0 の場合はキーが存在したためデータは更新されなかったことを意味する
127.0.0.1:6379> setnx key01 value02 
(integer) 0

# 既存のキーをリネームする
127.0.0.1:6379> rename key01 key02 
OK

# 現在のデータベースのキーの数を返す
127.0.0.1:6379> dbsize 
(integer) 4

# 特定のキーを別のデータベースへ移動する
127.0.0.1:6379> move key03 1 
(integer) 1
127.0.0.1:6379> select 1 
OK
127.0.0.1:6379[1]> get key03 
"value03"

# 現在のデータベースのキーを全て削除する
127.0.0.1:6379> flushdb 
OK

# 全てのデータベースのキーを全て削除する
127.0.0.1:6379> flushall 
OK
```

### Multiple Key
```
# 複数キーの値をまとめてセットする
127.0.0.1:6379> mset key01 value01 key02 value02 key03 value03 
OK

# 複数キーの値をまとめて参照する
127.0.0.1:6379> mget key01 key02 key03 
1) "value01"
2) "value02"
3) "value03"
```

### expire
```
# 有効期限を設定してキーをセットする (下例は 60秒)
127.0.0.1:6379> setex key01 60 value01 
OK

# 既存のキーに有効期限を設定する
127.0.0.1:6379> expire key02 30 
(integer) 1
```

### Math
```
127.0.0.1:6379> set key02 1 
OK

# キーの値に 1 をプラスする
127.0.0.1:6379> incr key02 
(integer) 2

# キーの値に指定数をプラスする
127.0.0.1:6379> incrby key02 100 
(integer) 102

# キーの値に 1 をマイナスする
127.0.0.1:6379> decr key02 
(integer) 101

# キーの値に指定数をマイナスする
127.0.0.1:6379> decrby key02 51 
(integer) 50
```

### List
```
# リストの先頭に値を追加する (スペース区切りで複数値を指定可)
127.0.0.1:6379> lpush list01 value01 
(integer) 1

# リストの末尾に値を追加する (スペース区切りで複数値を指定可)
127.0.0.1:6379> rpush list01 value02 
(integer) 2

# リストの要素の数を返す
127.0.0.1:6379> llen list01 
(integer) 2

# リスト中の指定番号の要素を返す
127.0.0.1:6379> lindex list01 0 
"value01"

# リスト中の指定した開始番号から終了番号までの要素を返す
127.0.0.1:6379> lrange list01 0 1 
1) "value01"
2) "value02"

# リストの指定番号の要素を指定値に変更する
127.0.0.1:6379> lset list01 1 value03
OK
127.0.0.1:6379> lindex list01 1 
"value03"

# リストの先頭の要素を返して削除する
127.0.0.1:6379> lpop list01 
"value01"

# リストの末尾の要素を返して削除する
127.0.0.1:6379> rpop list01 
"value03"

# リスト中の指定した開始番号から終了番号までの要素に切り取った形でそのリストを更新
127.0.0.1:6379> ltrim list01 1 3 
OK
```


### Hash

親Key(key)、子Key(field)、値(value)により管理されるデータ型。
例えば、親Keyを商品ID、子キーを商品の属性情報を保存するような形で使用すれば、RDBでのデータ管理に近い考え方で利用可能

```
# ハッシュの指定フィールドに値を追加する
127.0.0.1:6379> hset hash01 field01 value01 
(integer) 1

# ハッシュの指定フィールドの値を返す
127.0.0.1:6379> hget hash01 field01 
"value01"

# ハッシュの複数フィールドに追加する
127.0.0.1:6379> hmset hash01 field02 value02 field03 value03 
OK

# ハッシュの複数フィールドの値を返す
127.0.0.1:6379> hmget hash01 field01 field02 field03 
1) "value01"
2) "value02"
3) "value03"

# ハッシュのフィールドを全て返す
127.0.0.1:6379> hkeys hash01 
1) "field01"
2) "field02"
3) "field03"

# ハッシュのフィールドの値を全て返す
127.0.0.1:6379> hvals hash01 
1) "value01"
2) "value02"
3) "value03"

# ハッシュの指定フィールドの値を指定数プラスする
127.0.0.1:6379> hincrby hash01 field04 100 
(integer) 101

# ハッシュの指定フィールドが存在するか確認する
127.0.0.1:6379> hexists hash01 field01 
(integer) 1

# ハッシュのフィールド数を返す
127.0.0.1:6379> hlen hash01 
(integer) 4

# ハッシュの指定フィールドを削除する
127.0.0.1:6379> hdel hash01 field04 
(integer) 1
```