프로젝트를 하면서 redis를 사용하였는데 그걸 정리 하였습니다.
RedisConfig.java
import com.group.Bmart.domain.item.service.response.ItemRedisDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@EnableCaching
@Configuration
public class RedisConfig {
// application.yml에 등록된 정보를 가져왔습니다.
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
// serializer 설정으로 redis-cli를 통해 직접 데이터를 조회할 수 있도록 설정
@Bean
public RedisTemplate<String, Long> stringToLongRedisTemplate() {
RedisTemplate<String, Long> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericToStringSerializer<>(Long.class));
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
@Bean
public ListOperations<String, String> listOperations(
RedisTemplate<String, String> redisStringTemplate) {
return redisStringTemplate.opsForList();
}
@Bean
public RedisTemplate<String, ItemRedisDto> itemRedisDtoRedisTemplate() {
RedisTemplate<String, ItemRedisDto> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(ItemRedisDto.class));
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
}
@EnableCaching
어노테이션을 사용하여 캐싱 기능을 활성화할 수 있습니다.
redisConnectionFactory
redisConnectionFactory() 메서드는 LettuceConnectionFactory를 사용하여 Redis 연결 팩토리를 생성합니다.
listOperations
listOperations() 메서드는 RedisTemplate<String, String>을 사용하여 Redis 리스트를 조작하는 ListOperations<String, String> 인터페이스를 반환합니다. 이를 통해 Redis 리스트에 데이터를 추가하고 조회할 수 있습니다.
itemRedisDtoRedisTemplate
itemRedisDtoRedisTemplate() 메서드는 RedisTemplate<String, ItemRedisDto>를 생성하고, 이를 사용하여 ItemRedisDto 객체를 직렬화하여 Redis에 저장합니다. 이를 위해 StringRedisSerializer와 Jackson2JsonRedisSerializer를 사용합니다. 전자는 문자열을 직렬화하고 역직렬화하기 위한 것이고, 후자는 Jackson을 사용하여 객체를 JSON 형식으로 직렬화하고 역직렬화합니다.
실제 비즈니스 로직
package com.group.Bmart.domain.item.service;
import com.group.Bmart.domain.item.service.response.ItemRedisDto;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ItemCacheService {
private final RedisTemplate<String, ItemRedisDto> redisTemplate;
private static final String NEW_PRODUCTS_KEY = "new_products";
// 새로운 상품 정보를 Redis에 저장하는 메서드
public void saveNewItem(final ItemRedisDto itemRedisDto) {
redisTemplate.opsForList().rightPush(NEW_PRODUCTS_KEY, itemRedisDto);
}
// Redis에서 저장된 모든 새로운 상품 정보를 가져오는 메서드
public List<ItemRedisDto> getNewItems() {
ListOperations<String, ItemRedisDto> listOperations = redisTemplate.opsForList();
Long itemCount = listOperations.size(NEW_PRODUCTS_KEY);
if (itemCount == null || itemCount == 0) {
return null; // 저장된 상품 정보가 없을 경우 null 반환
}
return listOperations.range(NEW_PRODUCTS_KEY, 0, -1); // 모든 상품 정보를 리스트 형태로 반환
}
}
private final RedisTemplate<String, ItemRedisDto> redisTemplate 을 활용한다.
'데이터베이스' 카테고리의 다른 글
db 인덱스 (1) | 2024.10.22 |
---|---|
[MySQL] 프로시저 만들기(DECLARE, SET, IN, IF, ELSEIF 등) (0) | 2023.06.14 |
데이터베이스별 랜덤으로 레코드 가져오기 쿼리 정리 (0) | 2022.11.09 |
[MySql] 효과적인 인덱스 설계 (0) | 2022.11.07 |
PostgreSQL 배열 함수 array_agg, array_to_string, unnest, array_append (0) | 2022.11.04 |