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操作が可能になります。
@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を指定。
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 を作成
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;
}
}
データの取得方法は以下の方法があるため、必要なものを使用
// キーで値を取得
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 を作成
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()などを書かなければならないため、こちらのほうが、手間が省けるかなと思います。
また、時間を指定することで、自動削除できるというのもポイントです。