RedisのCRUD

## バージョン確認

Redisサーバーの起動

```
redis-server --version
redis-server -v
```

```
redis-cli --version
redis-cli -v
```

## サーバの起動

Redisサーバーの起動

```
redis-server
```

強制終了（※ データが保存されないことがある）

```
Ctrl + C
```

## クライアントからサーバーに接続

別のターミナルでRedisサーバーに接続

```
redis-cli
```

クライアントの終了

```
exit
```

クライアントからサーバーの終了（※ データが保存される）

```
shutdown
```

## 動作の確認

```
redis 127.0.0.1:6379> set key val
OK
redis 127.0.0.1:6379> get key
"val"
```

## データベースの選択

データベースは番号で管理され、名前をつけることはできません。

デフォルトでは0番のデータベースに接続されていますが、以下のように切り替えることができます。

```
select 1
```

```
select 2
```

とりあえず0に合わせておきましょう。

```
select 0
```

## データの保存

Redisでは自動的にディスクに保存されますが、明示的にディスクに保存することができます。

```
bgsave
```

保存先は、Resisサーバーを起動したディレクトリに、「dump.rdb」のファイル名で保存されています。

Redisを起動するときは、同じディレクトリで起動する必要があります。

## Strig型の書き込み

データの書き込み

```
set key value
```

まとめて書き込み

```
mset key value key value ...
```

データの取得

```
get key
```

まとめてデータの取得

```
mget key key key ...
```

「name」というキーに、「nakano」という値を格納します。

```
set name nakano
```

「name」キーを取得します。

```
get name
```

まとめて「email」キーと「score」キーに値を格納します。

```
mset email hoge@foo.com score 120
```

キーに格納された値をまとめて取得します。

```
mget name email score
```

## 数値を増減する

以下のコマンドでStringに数値が格納された場合に値を増減させることができます。

```
incr / incrby 増加幅
decr / decrby 減少幅
```

数値を1繰り上げます。

```
incr score
```

数値を取得します。

```
get score
```

数値を10減少させます。

```
decrby score 10
```

数値を取得します。

```
get score
```

## KEYの操作

全キー検索

```
keys *
```

パターン検索

```
keys *m*
```

キーの存在確認

```
exists score

```

```
exists age
```

キーの名前を変更

```
set age 14
```

```
rename age nenrei
```

```
keys *
```

キーの削除

```
del nenrei
```

```
keys *
```

```
set age 14
```

キーの有効期限(５秒)

```
expire age 5
```

```
get age
```

ランダムにキーを返す

```
randomkey
```


## List型の書き込み

```
左端に追加 lpush
右端に追加 rpush
左端を削除 lpop
右端を削除 rpop
```

要素を追加

```
rpush mycolor pink
rpush mycolor green
rpush mycolor red
rpush mycolor yellow
rpush mycolor blue
rpush mycolor purple
```

0番目から5番目まで取得

```
lrange mycolor 0 5
```

0番目から、最後から1番目まで取得

```
lrange mycolor 0 -1
```

右端を削除

```
rpop mycolor
```

```
lrange mycolor 0 -1
```

左端を削除

```
lpop mycolor
```

```
lrange mycolor 0 -1
```


2番目の要素を取得

```
lindex mycolor 2
```

要素の数を取得

```
llen mycolor
```

要素を0番目から2番目以外を削除

```
ltrim mycolor 0 2
```

```
lrange mycolor 0 -1
```

## Set型の書き込み

```
追加 sadd
削除 srem
一覧 smembers
和集合 sunion
積集合 sinter
差集合 sdiff
```

要素の追加

```
sadd myset1 a
sadd myset1 b
sadd myset1 c
```

要素の一覧

```
smembers myset1
```

後から要素を追加

```
sadd myset1 d
```

要素の一覧（順不同で表示される）

```
smembers myset1
```

要素の削除

```
srem myset1 d
```

```
smembers myset1
```

別のSet型データを作成

```
sadd myset2 b
sadd myset2 c
sadd myset2 d
sadd myset2 e
```

```
smembers myset1
```

```
smembers myset2
```

和集合

```
sunion myset1 myset2
```

積集合

```
sinter myset1 myset2
```

差集合

```
sdiff myset1 myset2
```

和集合から新しいデータを作成

```
sunionstore myunion myset1 myset2
```

```
smembers myunion
```

## Sorted Set型の書き込み

```
追加 zadd
削除 zrem
一覧 zrange
ランク zrank
```

要素を追加

```
zadd hs 22 nakano
zadd hs 50 tanaka
zadd hs 80 sato
zadd hs 21 suzuki
```

低い方から一覧を取得

```
zrange hs 0 -1
```

高い方から一覧を取得

```
zrevrange hs 0 -1
```

低い方から順位を取得

```
zrank hs nakano
```

高い方から順位を取得

```
zrevrank hs nakano
```

## Hash型の書き込み

```
hset 追加
hmset 複数追加
hget 取得
hmget 複数取得
hlen 要素数を取得
hkeys キーをすべて取得
hvals 値をすべて取得
hgetall キー、値をすべて取得
```

値をセット

```
hset user name nakano
```

値を複数セット

```
hmset user email hoge@foo.com score 120
```

値を取得

```
hget user email
```

値を複数取得

```
hmget user name email score
```

要素数を取得

```
hlen user
```

キーをすべて取得

```
hkeys user
```

値をすべて取得

```
hvals user
```

キー、値をすべて取得

```
hgetall user
```

## sort

List型のソート

String型を少ない順にソート

```
lpush myscore 22
lpush myscore 50
lpush myscore 80
lpush myscore 21
```

データ型の確認

```
type myscore
```

```
lrange myscore 0 -1
```

```
sort myscore
```

多い順にソート

```
sort myscore desc
```

0番目から3つ分、多い順にソート

```
sort myscore desc limit 0 3
```

アルファベット順のソート

```
keys *
```

```
lrange mycolor 0 -1
```

```
sort mycolor alpha
```

```
sort mycolor slpha desc
```

Set型のソート

```
smembers myset1
```

```
sort myset1 alpha
```

## multi / exec

RDBのトランザクションに近いですが、処理の途中でサーバーがダウンした場合は途中の処理が実行されることがあります。

```
multi
処理
処理
処理
exec（実行）/discard（キャンセル）
```

```
multi
incr counter
incr visitor
exec
```