0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

valkeyにRedisTemplateを使用して登録・取得を行う。

Last updated at Posted at 2024-09-18

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()などを書かなければならないため、こちらのほうが、手間が省けるかなと思います。

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?