SpringBoot + Redis 簡単に作るデモ

### はじめに
springbootとは、java開発者にとって一番使いやすいフレームワークだと思います。
redisとは、人気のNOSQLのDBの一つです。
今回はspringbootとredisを使ってCURDのデモを作ります。

### 事前準備
 １．環境：
　　　　　SpringBoot
　　　　　Redis
　　　　　Gradle
　
　２．プロジェクト構築
　　[Spring Initializr](https://start.spring.io/)を頼んで自動的にプロジェクト雛形を生成されます。
   
　　以下のように設定してください。
　　　①　Gradle Project
　　　②　Java
　　　③　Spring Boot 2.1.5

　　![Spring_project.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/419e2da9-3640-5ab3-d883-418be8853109.jpeg)

### やったこと
１．まずはプロジェクト用のライブラリを導入するため、以下の設定を行う。
　①　build.gradleファイルを開いて以下のようにkey-valueの形で設定します。

```
　　　dependencies {
    　　implementation('org.springframework.boot:spring-boot-starter-data-redis')
    　　implementation('org.springframework.boot:spring-boot-starter-web')
    　　testImplementation('org.springframework.boot:spring-boot-starter-test')
　　　}
```

 ２．redis　サービスの配置
　　application.propertiesを開く、以下の内容を追加する。(パスワードなくてもいいです。)

```
　　　server.port=8088
　　　spring.redis.database=0
　　　spring.redis.host=localhost
　　　spring.redis.port=6379
　　　spring.redis.password=
　　　spring.redis.timeout=200
```

　３．実装したソースです。
　　　
　　　まずはRedisConfig.javaを作って、

```      
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
    RedisTemplate<String,Object> template = new RedisTemplate <>();
    template.setConnectionFactory(factory);

    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new  Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);

    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    // key采用String的序列化方式
    template.setKeySerializer(stringRedisSerializer);
    // hash的key也采用String的序列化方式
    template.setHashKeySerializer(stringRedisSerializer);
    // value序列化方式采用jackson
    template.setValueSerializer(jackson2JsonRedisSerializer);
    // hash的value序列化方式采用jackson
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
  }
}

```

　後はRedisService.javaを作って、いろんな機能を実装します。

```
    @Service
    public class RedisService {

      /**
       * 注入redisTemplate bean
       */
      @Autowired
      private RedisTemplate<String,Object> redisTemplate;

      /**
       * 删除缓存
       *
       * @param key 可以传一个值 或多个
       */
      @SuppressWarnings("unchecked")
      public void del(String... key) {
        if (key != null && key.length > 0) {
          if (key.length == 1) {
            redisTemplate.delete(key[0]);
          } else {
            redisTemplate.delete(CollectionUtils.arrayToList(key));
          }
        }
      }

      /**
       * 普通缓存获取
       *
           * @param key 键
       * @return 值
           */
      public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
      }

      /**
       * 普通缓存放入
       *
       * @param key   键
       * @param value 值
       * @return true成功 false失败
       */
      public boolean set(String key, Object value) {
        try {
          redisTemplate.opsForValue().set(key, value);
          return true;
        } catch (Exception e) {
          e.printStackTrace();
          return false;
        }
      }
}
```

　最後に機能をテストため、コントローラを作ってみました。

```
@RestController
@RequestMapping(value = "/redis")
public class RedisController {
    /**
     * 注入redisTemplate bean
     */
      @Autowired
      private RedisService redisService;

      /**
       * 保存(更新)数据
       * @param key
       * @param value
       * @return
       */
      @RequestMapping(value="/add",method=RequestMethod.GET)
      public String add(String key,String value) {
          redisService.set(key, value);

          return "add successfully";
      }

      /**
       * 删除指定数据
       * @param key
       * @return
       */
      @GetMapping(value="/delete")
      public String delete(String key) {

          redisService.del(key);
          return "delete successfully";
      }

      /**
       * 读取指定数据
       * @param key
       * @return
       */
      @GetMapping(value="/get")
      public String get(String key) {
          return redisService.get(key)==null ? "data don't exist!" :     redisService.get(key).toString();
      }
}
```

### テスト

　まずはRedisサーバーをredis-server redis.windows.confで起動します。以下のようなです。
　![redis.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/d17ba8e1-2656-f12c-33ae-22983882d5cc.jpeg)

  その後、プロジェクトをスタートする。
　
　①　保存機能をテスト
　　テストテータ：{city:tokyo}
    URL : localhost:8088/redis/add?key=city&value=tokyo
   ブラウザでテストURLを入力し、アクセスすると正常に保存することが見えます。
　　![保存数据.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/20efdb35-a86a-d245-55fd-32c538ce685e.jpeg)

  ②　取得機能をテスト
　　URL : localhost:8088/redis/get?key=city
  ほら、先に保存したデータを取得します。
    
  ![读取数据.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/24083ed3-d4c1-d5a9-8db1-a1fec9c77f9e.jpeg)

　③　削除機能をテスト
　  URL : localhost:8088/redis/delete?key=city

 保存されたデータを削除します。

![删除数据.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225740/60bc0b01-80a1-aec7-715e-6d3cb4bd048e.jpeg)

テストはここまでです。

### 最後に
この記事に興味があれば、[ぜひ、ここ](https://github.com/Hyman1993/Demo-Projects/tree/master/springboot_redis)にソースをダウンロードします。

本来の記事サイト：http://160.16.146.245/u/hyman/blogs/11

以上