반응형
Redis란
✔️ 메모리 기반의 데이터 저장소로, 높은 성능을 제공하는 NoSQL 데이터베이스입니다.
Key, Value 구조의 비정형 데이터를 저장하고 관리할 수 있습니다.
규모가 작은, 사용자가 많지 않은 서비스의 경우에는 WEB - WAS - DB의 구조로 모든 정보를 데이터베이스에 저장합니다.
하지만 사용자가 늘어나 조회의 빈도가 늘어난다면, 데이터베이스가 과부하될 수 있고, 또한 성능 저하가 일어날 수 있습니다.
그래서 이를 개선하고자, 캐시 서버를 도입하여 데이터베이스 서버의 과부하를 줄여주는데 이때 사용할 수 있는 캐시 서버 중 하나가 Redis입니다.
캐시란
✔️ 캐시는 한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결괏값을 받을 수 있도록 도와주는 공간입니다.
같은 요청이 여러 번 들어오는 경우 매번 데이터 베이스를 거치는 것이 아니라 캐시 서버에서 첫 번째 요청 이후 저장된 결괏값을 바로 내려주기 때문에 DB의 부하를 줄여주고 서비스의 속도도 느려지지 않습니다.
Redis 사용에 주의할 점
- 서버에 장애가 발생했을 경우 그에 대한 운영 대책이 꼭 필요합니다.
: 인메모리 데이터 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문입니다. - 메모리 관리가 중요합니다.
- 싱글 스레드의 특성상, 한 번에 하나의 명령만 처리할 수 있습니다. 처리하는데 시간이 오래 걸리는 요청, 명령은 피해야 합니다.
Springboot와 연동하기
0. Redis 설치
Redis 깃허브로 들어가 .msi 설치 파일을 다운로드한다.
1. build.gradle에 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
2. application.yml 설정
spring:
redis:
host: localhost
port: 6379
✔️ 사용할 Redis의 host와 port를 지정해 줍니다.
로컬에서는 기본적으로 host를 localhost로 지정해 줍니다.
다른 서버나 도커 등을 이용한다면 그에 맞게 host명을 변경해 주어야 합니다.
3. Redis Template 사용
@Component
@RequiredArgsConstructor
public class RedisUtil {
private final StringRedisTemplate stringRedisTemplate;
// Redis에서 특정 Key를 가진 value 얻기
public String getData(String key) {
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
return valueOperations.get(key);
}
// Key: Value 저장시 만료 기한 설정
public void setDataExpire(String key, String value, Duration duration) {
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(key, value, duration);
}
// Redis에서 특정 Key를 가진 Value 삭제
public void deleteData(String key) {
stringRedisTemplate.delete(key);
}
// 임시 Token을 Refresh Token과 충돌이 일어나지 않게 하기 위해 키 하나 더 받기
public void setDataExpireWithPrefix(String prefix, String key, String value, Duration duration) {
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
String fullKey = prefix + ":" + key;
valueOperations.set(fullKey, value, duration);
}
}
4. Redis Config 설정하기
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
redisConfiguration.setHostName(host);
redisConfiguration.setPort(port);
return new LettuceConnectionFactory(redisConfiguration);
}
- RedisConnectionFactory는 Redis와의 연결을 제공하는 인터페이스입니다.
- RedisStandaloneConfiguration은 Redis 단독 구성을 나타내며, 호스트와 포트를 설정합니다.
- LettuceConnectionFactory는 Redis 연결 팩토리를 생성하고 반환합니다.
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
return template;
}
- RedisTemplate<byte[], byte[]> template = new RedisTemplate<>(): RedisTemplate 객체를 생성합니다. 이 객체는 Spring에서 제공하는 Redis 작업을 담당하는 클래스입니다. 키와 값이 모두 byte[]로 설정되어 있습니다.
- template.setConnectionFactory(redisConnectionFactory()): RedisTemplate이 사용할 Redis 연결 팩토리를 설정합니다. 이 연결 팩토리는 Redis 서버와의 연결을 관리합니다.
Redis 간단 명령어 정리
127.0.0.1:6379> FLUSHDB // 데이터 모두 삭제
OK
127.0.0.1:6379> KEYS * // 모든 키 검색
(empty array)
127.0.0.1:6379> SET 1 "hello-world" // 키 1에 데이터 "hello-world" 삽입
OK
127.0.0.1:6379> GET 1 // 키 1 조회
"hello-world"
127.0.0.1:6379> KEYS *
1) "1"
127.0.0.1:6379> DEL 1 // 키 1 삭제
(integer) 1
127.0.0.1:6379> KEYS *
(empty array)
반응형