package com.yesul.config;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
/**
* redis의 연결 정보 설정
*/
// RedisTemplate 캐싱 (DB 인덱스별로 하나씩만 생성해서 재사용)
private final Map<Integer, RedisTemplate<String, String>> redisTemplateMap = new ConcurrentHashMap<>();
public RedisTemplate<String, String> getRedisTemplate(int dbIndex) {
return redisTemplateMap.computeIfAbsent(dbIndex, this::createRedisTemplateForDb);
}
private RedisTemplate<String, String> createRedisTemplateForDb(int dbIndex) {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPort(port);
config.setDatabase(dbIndex);
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
connectionFactory.afterPropertiesSet();
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
package com.yesul.chatroom.service;
import com.yesul.config.RedisConfig;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class TempMessageServiceImpl implements TempMessageService {
private final RedisConfig redisConfig;
private static final long TTL_SECONDS = 60 * 60; // 1시간
@Override
public void saveTempMessage(Long chatRoomId, Long userId, String message, int dbIndex) {
RedisTemplate<String, String> redisTemplate = redisConfig.getRedisTemplate(dbIndex); // DB별로 RedisTemplate 가져오기
redisTemplate.opsForValue().set(key(chatRoomId, userId), message, TTL_SECONDS, TimeUnit.SECONDS);
}
@Override
public String getTempMessage(Long chatRoomId, Long userId, int dbIndex) {
RedisTemplate<String, String> redisTemplate = redisConfig.getRedisTemplate(dbIndex);
return redisTemplate.opsForValue().get(key(chatRoomId, userId));
}
@Override
public void deleteTempMessage(Long chatRoomId, Long userId, int dbIndex) {
RedisTemplate<String, String> redisTemplate = redisConfig.getRedisTemplate(dbIndex);
redisTemplate.delete(key(chatRoomId, userId));
}
private String key(Long chatRoomId, Long userId) {
return "temp-message:" + chatRoomId + ":" + userId;
}
}
ttl을 작성해주고 dbIndex를 통해 레디스 템플릿을 설정, 이후에 key 메서드를 통해 레디스에 저장할 수도 있고, key함수를 통해 꺼내쓸수도 있음
redisConfig.getRedisTemplate(dbIndex)
→ 주어진 dbIndex에 맞는 RedisTemplate을 가져옴. Redis는 0~15까지의 DB 인덱스를 지원하는데, 이 중 어떤 DB를 사용할지 지정함.
opsForValue()
→ Redis에서 String key - String value 구조의 데이터를 다룰 때 사용하는 API.
get(key(chatRoomId, userId))
→ key를 직접 생성한 뒤 해당 key로 Redis에서 값을 조회함.
예를 들어 key(chatRoomId, userId)가 "chat:123:456"라면, 이 key로 저장된 value를 가져옴
<aside> 💡
나는 1번 가영누나 2번 정연 누나 3번 사용하기!!!!!!1
</aside>


