SpringDataRedisの使い方入門

基本的JavaでRedisデータベースを操作するには、以下の3つの方法があります。
·Jedis
·Lettuce
·SpringDataRedis

ここでは、Spring Data Redis を使った迅速な設定方法と基本操作について共有します。全部で4つのステップがあります。

# 1.Maven依赖のインポート
以下のようにpom.xmlに依存関係を追加します：
```java
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
```
これで、Spring Data Redisをプロジェクトに導入できます。

# 2.Redisデータソースの設定
以下は、application.ymlを使用して設定する方法です。
一部のバージョンが低いSpring Bootでは、`spring.data.redis`の構造で記述するように指摘される場合があります。
```java
  redis:
    host: localhost
    port: 6379
    password: YOUR_PASSWORD
    //使いたいdbを指定　デフォルトはDB0
    database: DB0
```

# 3.設定クラスを作成し、RedisTemplate オブジェクトを生成します（オプション）
シリアライザを設定する為です。
文字列またはJSON形式に設定することで、開発者が読みやすくするためです。

```java
@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("Redisテンプレートオブジェクトの作成を開始します。");
        RedisTemplate redisTemplate = new RedisTemplate();
        //Redisの接続ファクトリオブジェクトを設定します。
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        
        //Redisキーのシリアライザを設定します。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        
        //Value のシリアライザを設定します
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        //Hash KeyとHash Valueのシリアライザを設定します
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}
```

# 4.RedisTemplateオブジェクトを注入する
注入された`RedisTemplate`オブジェクトを使用してRedisを操作します。
##### （1）5つの基本的なデータ型に対応する操作オブジェクトの作成です。
```java
@SpringBootTest
public class SpringDateRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void testRedisTemplate(){
        System.out.println(redisTemplate);
        ValueOperations valueOperations = redisTemplate.opsForValue(); 
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
```

##### （2）String型
```java
    @Test
    public void testString(){
        //set get setex setnx
        redisTemplate.opsForValue().set("name","beijing");
        String name = (String) redisTemplate.opsForValue().get("name");
        System.out.println(name);

        //`setex`を使用して有効期限を設定します。
        redisTemplate.opsForValue().set("city","fujian",3, TimeUnit.MINUTES);

        //setnx
        redisTemplate.opsForValue().setIfAbsent("name","shenyang");

    }
```

##### （3）Hash型
```java

    @Test
    public void testHash(){
        //hset hget hdl hkeys hvals
        HashOperations hashOperations = redisTemplate.opsForHash();
        //hset
        hashOperations.put("100","name","tom");
        hashOperations.put("100","age","20");
        //hget
        hashOperations.get("100","name");

        //hkeys
        hashOperations.keys("100");

        //hvals
        hashOperations.values("100");

        //hdel
        hashOperations.delete("100","age");
    }

```

##### （4）List型
```java
    public void testList(){
        //lpush lrange rpop llen
        ListOperations listOperations = redisTemplate.opsForList();
        //lpush
        listOperations.leftPushAll("mylist","a","b","c");
        listOperations.leftPush("mylist","d");

        //lrange
        List list = listOperations.range("mylist",0,-1);

        //rpop
        listOperations.rightPop("mylist");

        //llen
        long size = listOperations.size("mylist");
    }
```

##### （5）Set型
```java

    public void testSet(){
        //sadd smembers scard sinter sunion srem
        SetOperations setOperations = redisTemplate.opsForSet();
    }
```

##### （6）Zset型
```java
    public void testZset(){
        //zadd zrange zincrby zrem
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
}
```