1) Redis와 연결: RedisConnectionFactory에 host, port를 설정하고 빈으로 등록
application.properties
redis.host=localhost
redis.port=6379
RedisConfig
@Configuration
public class RedisConfig {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
}
2) Redis 데이터 사용을 위한 설정
RedisTemplate에 RedisConnectionFactory, key serializer, value serializer를 설정하고 빈으로 등록
RedisTemplate을 사용하여 Redis와 상호 작용할 때, Key와 Value를 저장하고 검색하는데 사용되는 데이터는 기본적으로 Java의 객체입니다. 그러나 Redis는 내부적으로는 바이트 배열로 데이터를 저장하고 전송합니다. Serializer를 사용하면 자바 객체를 Redis에서 사용할 수 있는 바이트 배열로 변환하여 저장하고, 바이트 배열을 다시 자바 객체로 역직렬화하여 읽어올 수 있습니다.
Serializer를 사용하는 이유는 다음과 같습니다:
데이터 형식 일치:Redis는 다양한 데이터 형식을 지원하며, Serializer를 사용하여 자바 객체를 Redis 데이터 형식에 맞게 변환하여 저장합니다.
효율적인 전송:Serializer를 사용하면 효율적으로 데이터를 직렬화하고 전송할 수 있습니다. 특히, 바이너리 데이터를 다룰 때 중요합니다.
키/값의 유연성:Serializer를 사용하면 다양한 유형의 키와 값을 Redis에 저장할 수 있습니다. 문자열, 숫자, 객체 등 다양한 형식의 데이터를 처리할 수 있습니다.
자바 객체의 저장 및 읽기:Serializer를 사용하면 자바 객체를 Redis에 저장하고 읽을 수 있습니다. 이는 객체를 직렬화하여 저장하고 역직렬화하여 읽을 때 유용합니다.
RedisCLI를 사용하여 Redis 데이터를 조회할 때 문자열로 반환이 필요하기 때문에 설정!
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory()); //connection
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); // value
return redisTemplate;
}
}
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory()); //connection
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key
redisTemplate.setValueSerializer(new StringRedisSerializer()); // value
return redisTemplate;
}
}
에러
FileInfo cannot be cast to class java.lang.String (com.example.aifileapi.domain.FileInfo is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap')
FileInfo 클래스와 String 클래스 간 형변환이 잘못되었음을 알리는 에러
FileInfo 클래스는 파일 정보가 들어간 내가 만든 클래스 파일, 이 객체를 value로 넣을건데 형변환이 안되서 그렇다는 것
해결
JdkSerializationRedisSerializer를 이용하여 value값을 저장
JdkSerializationRedisSerializer는 Java의 직렬화(serialization) 메커니즘을 이용하여 데이터를 레디스에 저장하고 읽어오는 데 사용되는 Redis Serializer. Java 직렬화를 이용하여 객체를 이진 데이터로 변환하고, 그것을 레디스에 저장함. 레디스에서 데이터를 읽어올 때에도 이진 데이터를 역직렬화하여 Java 객체로 변환.
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory()); //connection
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // value
return redisTemplate;
}
redis-cil 확인
# 전체 키 조회
KEYS *
# 해당키의 value 조회
GET {키}
Java 직렬화를 이용하여 객체를 이진 데이터로 변환하고, 그것을 레디스에 저장했기 때문에 value가 byte형식으로 저장된 것을 확인할 수 있음
하지만 CLI에서 데이터를 직접 확인하고 싶다면 GenericJackson2JsonRedisSerializer()를 이용하여 json 직렬화하여 저장
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory()); //connection
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); // value
return redisTemplate;
}