valkeyにRedisTemplateを使用して登録･取得を行う｡

# 1､目的
RedisTemplateを使用して､valkeyへ登録･参照を行う｡この際､指定した時間のあとに､自動でデータが消えるようにする｡

# 2､環境概要
◯ホストOS
- Windos11
- Eclipse
- virtualBox:7.0

◯ゲストOS(virtualBox内の仮想環境)
- Ubuntu:22.04
- Docker:27.2.1
- ValKey:7.2.6

# 3､作業
## 1､RedisConfig (RedisTemplate) を作成
RedisTemplateは、RedisConfigの中でBeanとして登録され、アプリケーション全体で利用される、Redisとのやり取りを抽象化するクラスです。 RedisConfigでRedisTemplateをカスタマイズすることで、アプリケーションのニーズに合わせた柔軟なRedis操作が可能になります。

```java
@Configuration
public class RedisConfig {

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

        // ValueSerializerの設定（JSONなど）
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        serializer.setObjectMapper(mapper);
        template.setValueSerializer(serializer);

        return template;
    }
}
```

#### application.propertiesとRedisConfigの違い
- 基本的な接続設定: application.propertiesで行う。
- 詳細なカスタマイズ: RedisConfigで行う。
詳細なカスタマイズ例
- シリアライザのカスタマイズ
- 接続プールの設定
- Redis Sentinelの設定
- Redis Clusterの設定

## 2、Controllerを作成
120秒後に自動で削除できるよう､引数でロング型120Lを指定｡
```java
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class DemoController {
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private MyService myService;

    @GetMapping("/save")
    public String saveUser() {
        UserEntity user = new UserEntity();
        user.setId("4");
        user.setName("ro");
        myService.saveDataWithExpiration("1234", user, 120L);
        return "redirect:/check"; // 保存後にリダイレクトし､/checkメソッドへ飛ぶ
    }
    
    @GetMapping("/check") // saveメソッドで登録された後こちらへ移動
    public String checkUser() {
    	Object user = myService.getDataWithExpiration("1234");
    	if (user != null) {
            // userの情報を表示したり、他の処理を行う
            System.out.println("User: " + user);
        } else {
            // ユーザーが見つからない場合の処理
        	 System.out.println("User: " + "削除");
        }
        return "redirect:https://www.google.com/";
    }

}
```

## 3、Service を作成
```java
package com.example.demo;

import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void saveDataWithExpiration(String key, UserEntity value, Long expiration) {
        redisTemplate.opsForValue().set(key, value, expiration, TimeUnit.SECONDS);
    }
    
    public Object getDataWithExpiration(String key) {
    	Object value  = redisTemplate.opsForValue().get(key);
    	return value;
    }
}
```

データの取得方法は以下の方法があるため､必要なものを使用
```java
// キーで値を取得
String key = "myKey";
Object value = redisTemplate.opsForValue().get(key);

// ハッシュからフィールドを取得
String hashKey = "myHash";
String field = "myField";
Object hashValue = redisTemplate.opsForHash().get(hashKey, field);

// リストから要素を取得
String listKey = "myList";
List<Object> listValues = redisTemplate.opsForList().range(listKey, 0, -1); // 全要素を取得
```

## 4､Entity を作成
```java
package com.example.demo;

import org.springframework.data.redis.core.RedisHash;

import lombok.Data;

@Data
@RedisHash("users") 
public class UserEntity {
    private String id;
    private String name;
    // 他のプロパティ (年齢、メールアドレスなど)
}
```


# 4､まとめ
前に作成した記事ではRepositoryを使った方法を書きました｡

その方法のほうが自分はわかりやすかったですが､Repositoryを使用すると､find()などを書かなければならないため､こちらのほうが､手間が省けるかなと思います｡

また､時間を指定することで､自動削除できるというのもポイントです｡