Redis, REmote DIctionary Server (원격 사전 서버.. 처음알았음..)
주로 아래 용도로 많이 사용했다. 그리고 사용 한다고 한다.
1. 캐싱 - 단순한 캐싱시 @Cacheable 어노테이션이 편리함
2. 세션관리
3. 대기열
4. 분산락 (동시성 문제 - 재고관리, 중복결제, 배치 중복 실행 방지) - RedissonClient 사용
5. 레이트 리미터 (트래픽을 조절해 서비스의 안전성 확보)
아래 설정으로 스프링 레디스를 사용할 준비 끝~
기본 설정
// build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.redisson:redisson-spring-boot-starter' // 분산락 사용시
}
// application.yml
spring:
data:
redis:
host: localhost
port: 6379
password: yourpassword # 필요한 경우
database: 0
// CacheConfig.java
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory(
@Value("${spring.data.redis.host}") String host,
@Value("${spring.data.redis.port}") int port) {
return new LettuceConnectionFactory(host, port);
}
// redisTemplate 사용을 위해
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
// @Cacheable 사용시 key별 ttl 설정을 위해
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
cacheConfigurations.put("userCache", defaultConfig.entryTtl(Duration.ofMinutes(10)));
cacheConfigurations.put("productCache", defaultConfig.entryTtl(Duration.ofHours(1)));
cacheConfigurations.put("orderCache", defaultConfig.entryTtl(Duration.ofDays(1)));
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaultConfig)
.withInitialCacheConfigurations(cacheConfigurations)
.build();
}
}
서비스에서 사용 방법
@Service
@RequiredArgsConstructor
public class UserService {
private final RedisTemplate<String, Object> redisTemplate;
@Cacheable(value = "userCache", key = "#userId")
public User getUserById(Long userId) {
// DB 조회 로직
return findUserFromDatabase(userId);
}
@Cacheable(value = "userCache", key = "'user:' + #userId + ':profile'")
public UserProfile getUserProfile(Long userId) {
return findUserProfileFromDatabase(userId);
}
// RedisTemplate 직접 활용 예제
public void setUserData(String key, User user) {
redisTemplate.opsForValue().set(key, user, Duration.ofMinutes(30));
}
public User getUserData(String key) {
return (User) redisTemplate.opsForValue().get(key);
}
// Hash 타입 활용
public void setUserHash(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}
public Object getUserHash(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
// 캐시 삭제
@CacheEvict(value = "userCache", key = "#userId")
public void deleteUserCache(Long userId) {
}
public void deleteKey(String key) {
redisTemplate.delete(key);
}
}
'개발 > 백엔드' 카테고리의 다른 글
Spring Circuit Breaker (0) | 2024.12.30 |
---|---|
Spring Rate Limiter (1) | 2024.12.26 |
Spring Kafka 기본 설정 및 실행 (2) | 2024.12.25 |
Kafka 기본 개념과 구조 (1) | 2024.12.25 |
Spring Redis - SortedSet으로 대기열 만들기 (1) | 2024.12.23 |