Redisをdockerでいじってみる on Mac

# Redisコンテナの用意
まずコンテナを用意します。

```Terminal
$ docker run --name redis -d -p 6379:6379 redis redis-server --appendonly yes
```

Redisサーバにローカルから接続できるようにこちらもインストールしましょう

```
$ brew install redis
```
接続を確認してみましょう

```
$ redis-cli
127.0.0.1:6379>
```
clientの名前を見てみましょう

```
> client getname
(nil)

> client list
id=3 addr=172.17.0.1:38130 fd=9 name= age=3650 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
```
nilという何も値が入ってない状態となっているので名前をつけてあげましょう

```
> client setname redis
OK

> client getname
"redis"
> client list
id=3 addr=172.17.0.1:38130 fd=9 name=redis age=3694 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
```




# Redisの操作

## key-valueの入力, valueの出力
`set`で入力, `get`で出力を行います。

```
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
get key
```

**例**

```
> set name John
OK
> get name
"John"
```

一度入力したkeyに、再度valueを入力すると上書きされます。

```
> set name Michael
OK
> get name
"Michael"
```

## 複数key-valueの入力, 複数valueの出力
複数のkey-valueの入力は`mset`, 複数のvalueの出力は`mget`で行います。

```
mset key value [key value ...]
mget key [key ...]
```

**例**
```
> mset name Bob name1 Peter
OK
> mget name name1
1) "Bob"
2) "Peter"
```

`name`はJohnからBobに上書きされ、`name1`は新しく作成されました。

## Keyの出力
keyの確認を行う場合, 以下を用います。

```
keys pattern
```

**例**

```
> keys *
1) "name"
2) "name1"
```

## Keyの存在確認
keyが存在するか否かを試す場合, 以下を用います。

```
exists key [key ...]
```

**例**

```
> exists name
(integer) 1
> exists name1
(integer) 1
> exists name2
(integer) 0
```
このように、存在するものは`1`, ないものに関しては`0`が出力されます。

## Key-Valueの削除
不要なkey-valueがある場合には、以下で消去しましょう。

```
del key [key ...]
```
**例**

```
> del name1
(integer) 1
> keys *
1) "name"
```

しっかり、`name1`が消えたことがわかります。

## Valueの操作
## 数値操作
`incr`で数値を１上昇, `decr`で数値を1減少させます。
`incrby`や`decrby`を用いた場合、keyの後ろで設定した数値だけ数に変化を与えることができます。

```
incr key 
decr key

incrby key increment
decrby key decrement
```
**例**

```
> mset int1 10 int2 10
OK
> incr int1
(integer) 11
> decr int2
(integer) 9
> mget int1 int2
1) "11"
2) "9"

> incrby int1 4
(integer) 15
> decrby int2 4
(integer) 5
> mget int1 int2
1) "15"
2) "5"
```
stringが入ったkeyを選択すると、Errorが起きます。

```
> set name2 Chris
OK
> incr name2
(error) ERR value is not an integer or out of range
```
##文字列操作
文字の足し算をしたい場合、`append`を用います。

```
append key value
```

**例**

```
> get name2
"Chris"
> append name2 Redfield
(integer) 13
> get name2
"ChrisRedfield"
``` 

## List型
### listの作成, valueの追加
`lpush`コマンドでは新しい要素をリストの先頭に追加して、 `rpush`では新しい要素を末尾に追加します。
対応するリストがない状態でこの操作が行われた場合は、新しいリストが作成されます。

```
rpush key value [value ...]
lpush key value [value ...]
```

listの中身を確認したい場合は,　以下のコマンドを用います。

```
lrange key start stop
```


**例**
まず、リストを作ってみます。

```
> rpush list1 1
(integer) 1

> lrange list1 0 1
1) "1"
```

では、左右から値をいれていきたいと思います。

```
> lpush list1 0
(integer) 2
> rpush list1 2 3 4 5
(integer) 6

> lrange list1 0 5
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
```

### リストの中のvalueの消去
リストの中身を消したいときは以下のコマンドを用います。

```
rpop key
lpop key
```

**例**

```
> rpop list1
"5"
> lpop list1
"0"

> lrange list1 0 5
1) "1"
2) "2"
3) "3"
4) "4"
```

### list内の任意のvalueを書き換え
listの中のindexを指定して、書き換えたい場合は以下のコマンドを用います。

```
lset key index value
```

**例**

```
> rpush list1 5
(integer) 5
> lset list1 4 100
OK

> lrange list1 0 4
1) "1"
2) "2"
3) "3"
4) "4"
5) "100"
```
## Set型
### setの作成, valueの追加
`sadd`コマンドによってvalueに追加していきます。
対応するsetがない状態でこの操作が行われた場合は、新しいsetが作成されます。

```
sadd key member [member ...]
```

setの中身を確認したい場合は, 以下のコマンドを用います。

```
smembers key
```

**例**

```
sadd set1 0 1 2 3 4
(integer) 5

> smembers set1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
```
### setの中のvalueの消去
setの場合は、indexが使えないので、中にどんな要素が入っているのかを知っている必要があります。

```
srem key value
```

**例**

```
> srem set1 4
(integer) 1

> smembers set1
1) "0"
2) "1"
3) "2"
4) "3"
```

### 和集合, 共通部分, 差集合
sunion(和集合): 2つのsetに入ってるvalueを重複無しで全て集めたもの
sinter(共通部分): 2つのsetで共通しているものを集めたもの 
sdiff(差集合): 2つのsetで共通でないものを集めたもの

```
sunion key key
sinter key key
sdiff key key
```

**例**

```
> sadd set2 3 4 5 6
(integer) 4

//set1 {1, 2, 3}
//set2 {3, 4, 5, 6}

> sunion set1 set2
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"

> sinter set1 set2
1) "3"

> sdiff set1 set2
1) "0"
2) "1"
3) "2"
```
# まとめ
ここで、基本的なコマンドについては網羅できているんではないでしょうか。
足りない場合は、こちらを参照していただければと思います。
https://redis.io/commands

次回以降で、PythonやGoと組み合わせられたらと思います。