Node.jsでRedisのいろんなメソッドを使ってみる


#はじめに
node.jsでredisを使う機会があり、今後も使う機会が多くなると思うのでまとめておこうかと思います。  
ここに書かれている型以外にも型は存在しますが、とりあえずよく使いそうなやつだけまとめました。

あくまでnode.jsでのredisの使い方をまとめているだけなので、全くredisに触れたことがない方はまずはドットインストールのredisの講座を受けてからこの記事を見るとスッと入ってくると思います。  
リンク(https://dotinstall.com/lessons/basic_redis)

# 基本コード

```js
const Redis = require('ioredis');
const redis = new Redis();

const main = async () => {

  ... //ここに処理を書いていく

  redis.disconnect();
}

main();
```

# string型
setはmysqlでいうinsert、getはselectです。

```js
await redis.set('key', 'val');
const result = await redis.get('key');
console.log(result); //val
```

配列でもセットできる

```js
const arr = ['key', 'val']
await redis.set(arr);
const result = await redis.get('key');
console.log(result); ///val
```

## 期限付きでset
setの第三引数に `EX ` 、第四引数に秒数を指定すると、指定した秒数だけ値を保存しておく  
下記のコードは2秒間だけ保存するようにしている
setTimeoutで2秒たったらgetしてくる処理を書き、結果がnullになる  
注)下記のコードでは `redis.disconnect();`を書くと先に接続を切ってしまうので書かないようにする

```js

await redis.set('key', 'val', 'EX', 2);
const result1 = await redis.get('key');
console.log(result1); //val

setTimeout(async () => {
  const result2 = await redis.get('key');
  console.log(result2); //null
}, 2000);
```

## msetとmget

```js
const arr = ['keys1', 'val1', 'keys2', 'val2']
await redis.mset(arr);
const result = await redis.mget('keys1', 'keys2');
console.log(result); //[ 'val1', 'val2' ] 配列で帰ってくる
```

# hash型
## hsetとhget
hsetは第一引数にキー名、第二引数にオブジェクトのキー名、第三引数にvalueを書く
hgetはstring型を返す

```js
await redis.hset('hash-key', 'key', 'value');
const result = await redis.hget('hash-key', 'key')
console.log(result); //value
```

## hmsetとhmget
hmgetの第二引数は配列
下のコードはObject.keys(hash)でhashのkeyを配列にまとめている
結果は配列で返ってくる

```js
const hash = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
await redis.hmset('hash-key', hash);
const result = await redis.hmget('hash-key', Object.key(hash))
console.log(result); //[ 'value1', 'value2', 'value3' ]
```

## hgetall
キー名を引数にとり、オブジェクトが返ってくる

```js
const hash = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
}
await redis.hmset('hash-key', hash);
const result = await redis.hgetall('hash-key')
console.log(result); //{ key1: 'value1', key2: 'value2',key3: 'value3' }
```

# list型

## lpushとrpushとlrange

lpushはlistの先頭に、rpushはlistの最後にpushされる
lpushとrpushは第一引数にキー名を取り、第二引数以降をpushする
lrangeは第一引数にキー名をとり、第二引数と第三引数にはそれぞれlistのインデックス番号を入れる
0と-1にするとそのlistの要素全てを取得してくる

### lpushとlrange

```js

await redis.lpush('arr-key1', 'val1', 'val2', 'val3', 'val4');
const result = await redis.lrange('arr-key1', 0, -1)
console.log(result); //[ 'val4', 'val3', 'val2', 'val1' ]
``` 
### rpushとlrange

```js
await redis.rpush('arr-key2', 'val1', 'val2', 'val3', 'val4');
const result = await redis.lrange('arr-key2', 0, -1)
console.log(result); //[ 'val1', 'val2', 'val3', 'val4' ]
```
第二引数に配列を指定することもできる(こっちしか使わなさそう)

```js
const arr = ['val1', 'val2', 'val3', 'val4']
await redis.rpush('arr-key', arr);
const result = await redis.lrange('arr-key', 0, -1)
console.log(result); //[ 'val1', 'val2', 'val3', 'val4' ]
```
## llen
llenは指定したキーのlistの長さを出力してくれる
jsでいうarray.length

```js
const arr = ['val1', 'val2', 'val3', 'val4']
await redis.rpush('arr-key', arr);
const result = await redis.llen('arr-key')
console.log(result); //4
```

# del
delはキー名を指定して削除します
型は関係ありません

```js
await redis.set('key', 'value');
const result1 = await redis.get('key')
console.log(result1); //value
await redis.del('key')
const result2 = await redis.get('key')
console.log(result2); //null
```

# 参考にしたサイト
- https://gemfury.com/azuki-trusty/deb:azk/-/content/usr/lib/azk/node_modules/hipache/node_modules/redis
- https://qiita.com/fagai/items/528f43d23c41f40a6dc1
- https://redis.io/
- http://intink.blogspot.com/2012/11/nodejs-redis.html