SpringBootでRedisを使ってみる

##はじめに

- 今回は最近よく耳にするNoSQLというやつを使ってみる
- NoSQLのうちRedisを使用する
- とりあえず動かすところまでを目標とする
- nosqlとRDBの違いがわからない人は他の方の記事を参考にしてください(詳しくは触れないです)

## 対象

- あくまでもJava(SpringBoot)ユーザー&&NoSQL初心者
- NoSQLに興味ある人

##Redisとは？

- NoSQLの一種
- オープンソースなやつ（他にも有名どこだと、CassandraとかMongoDBとか。使ったことはないです）
- KVSのデータベース（Mapみたいなイメージ？違ったらごめんなさい）

NoSQLについては、この方の記事がすごいうまくまとまっていたので、参考にしてください。
[NoSQLについて勉強する。](https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1#nosql-vs-yesql)

#早速遊んでみる

##用意したもの

- Macのターミナル
- IntelliJ(SpringBoot+Gradle)

##redis側

###ターミナルからbrew installでredisをインストールする
```shell
% brew install redis
```

###redis-serverで確認する
```shell
% redis-server
```
こんなやつがでたらOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/72e5b054-f17f-30f6-3256-aa8804eb16ef.png)
Ctrl+Cで抜けちゃいましょう。

###redis-cliする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/30497331-8096-7175-09ad-71be824fb04b.png)
怒られたので・・・

###以下のコマンドを実行する
```shell
%　ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents

%　launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
```

###再度redis-cliする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/dac514ef-9347-6687-b627-90b79badd19b.png)
入れたみたいです。遊べました！

##Spring側
- 適当にアプリケーションは用意してください

```gradle:build.gradle
compile ('org.springframework.boot:spring-boot-starter-redis:1.4.7.RELEASE')
```

上記の設定を追加するだけで、RedisTemplateが使えるようになります。
こいつを使ってあげることで、Mapをつかうような感覚でRedisにKeyとValueを登録できます。

```yaml:application.yml
spring.redis:
  host: localhost
  port: 6379
  password: null
  database: 0
```
こんな感じでymlに書いておけば、もうredisが使えます。デフォルトの設定値なので書く必要なかったらごめんなさい。
databaseはデフォルトで0から使いにいくようになってるっぽいです。

## 動かしてみる
そんなこんなで、もうRedisに登録できるようになってはいるのですが、あとはちょろとサンプルコードだけあげておきます。

```java:RedisSampleData


@Data
@Getter
@Setter
class RedisSampleData {

    private String string;

    private List<String> list;

    private Map<String, String> map;

}
```

```java:RedisSampleController


@RestController
@RequestMapping(value = "/SampleRedis")
public class RedisSampleController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @PostMapping
    public void post(@RequestBody RedisSampleData redisSampleData) {
        redisTemplate.delete("redis-tutorial:string");
        redisTemplate.opsForValue()
                .set("redis-tutorial:string", redisSampleData.getString());
        redisTemplate.delete("redis-tutorial:list");
        redisTemplate.opsForList()
                .rightPushAll("redis-tutorial:list",
                        redisSampleData.getList().toArray(new String[0]));
        redisTemplate.delete("redis-tutorial:map");
        redisTemplate.opsForHash()
                .putAll("redis-tutorial:map", redisSampleData.getMap());
    }

    @GetMapping
    public RedisSampleData get() {
        RedisSampleData redisSampleData = new RedisSampleData();
        redisSampleData.setString(
                redisTemplate.opsForValue()
                        .get("redis-tutorial:string")
        );
        redisSampleData.setList(
                redisTemplate.opsForList()
                        .range("redis-tutorial:list", 0, -1)
        );
        redisSampleData.setMap(
                redisTemplate.<String, String>opsForHash()
                        .entries("redis-tutorial:map")
        );
        return redisSampleData;
    }
}
```

```json:request.json
{
  "string": "太郎",
  "list": [
    "二郎",
    "三郎"
  ],
  "map": {
    "田中": "太郎",
    "山田": "二郎"
  }
}
```

叩いてみる・・・

```shell
% curl -X POST -H "Content-Type: application/json" http://localhost:8080/SampleRedis -d @request.json

% curl "localhost:8080/SampleRedis"
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245191/5a4d3ab4-3fd6-3f0e-46db-c5644b23463c.png)

##雑感

- SpringBootのおかげで結構簡単に使い始めることはできた
- ちゃんと使えるようになるにはもう少し時間がかかりそう

## 参照元
[Spring Data Redis](https://spring.io/projects/spring-data-redis)