[AWS] ElastiCache 와 Redis 적용

Coodori·2023년 3월 21일
0

CherishU

목록 보기
11/29

ElastiCache란?

Amazon ElastiCache는 인 메모리 데이터베이스 캐싱 시스템을 제공하여 애플리케이션이 데이터를 검색 할 수있는 성능, 속도 및 중복성을 향상시키는 클라우드 캐싱 서비스입니다.

  • Memcached 와 Redis 로 나뉘어진다.
  • 두개 다 이미 존재하는 서비스이지만 AWS에서 사용가능하도록 구현되었다.
  • Key-value 값으로 이루어져있다.
  • In memory cache 서비스
    • 데이터 처리 속도 향상을 위해 사용되는 메모리기반 DBMS
    • 자주쓰는 데이터를 메모리 위에 올려두어 DB에서 데이터를 가져와 속도를 느리게 하는 것을 방지함.
    • 하지만 메모리 위에 있기 때문에 전원 공급이 차단시 할당된 메모리에 저장된 값만 사용 가능
  • RDS와 다르게 AWS 외부에서 접속 할 수 없습니다.
    • 보안그룹을 설정해도 동일한 VPC에 속한 EC2 인스턴스에서만 접속가능합니다.

로컬 개발

로컬에서는 AWS ElastiCache를 접속하지 못하기 때문에 yml profile을 따로 설정해주어 local에서는 Redis를 사용하겠습니다.

그리고 Redis는 이메일 인증에 사용하려고합니다.
이메일 인증 코드를 발급 후 해당 인증코드를 잠시 저장하여 인증시에 활용하려는 목적입니다.

Redis란?

Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다.(NoSQL)

데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소입니다.

  • 사용이유
    데이터 베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않습니다. 하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있습니다.

    일반적으로 서비스 운영 초반이거나 규모가 작은, 사용자가 많지 않은 서비스의 경우에는 WEB - WAS - DB 의 구조로도 데이터 베이스에 무리가 가지 않습니다.

Redis Local 설치

  • redis 설치
    $ brew install redis
  • redis 실행
    $ brew services start redis
  • redis-cli 실행
    $ redis-cli
  • key-vaule 입력
    > set key value
  • key 찾기
    > get key
  • ket 삭제
    > del key
  • key 수정
    > rename key newkey

ElastiCache 생성

https://devlog-wjdrbs96.tistory.com/314
AWS 인스턴스 및 플랫폼 서비스들은 생성 방식이 비슷하므로
생략했다.

Spring Code

  • build.gradle - dependency
    implementation 'org.springframework.boot:spring-boot-starter-data-redis' // redis

  • Properites

@Getter
@AllArgsConstructor
@ConfigurationProperties("spring.data.redis")
public class RedisProperties {
    private String host;
    private int port;

}

로 yml 정보를 받아온다
default 로 localhost와 6379 가 입력되어있다.
그리고 EC2 위에서는 ElastiCache로 받아온다.
생성자 주입으로 받아왔다.

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
@RequiredArgsConstructor
public class RedisConfig {
    private final RedisProperties properties;
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(properties.getHost(), properties.getPort());
        return lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

Lettuce와 Jebis가 있는데 Lettuce를 사용하는 것이 좋다.
비동기로 요청을 처리하기에 보다 성능이 좋다.
성능 테스트 차이는
https://jojoldu.tistory.com/418 를 참고했다.

Lettuce는 TPS/CPU/Connection 개수/응답속도 등 전 분야에서 우위에 있다고 한다.

고로 Lettuce를 사용하여 빈 객체를 등록했다.

  • Serive
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisService {

    private final RedisTemplate<String, String> redisTemplate;

    public String redisString(String validCode) {
        ValueOperations<String, String> operations = redisTemplate.opsForValue();
        operations.set("validCode", validCode);
        String redis = operations.get("validCode");
        log.info("input = {} ",redis);
        return redis;
    }
}

메일 인증 코드에 해당 기능을 사용할 것이기때문에 <String,String> 으로 해당 값 넣어줬다.
추가로 잘 받아와지는지 테스트 코드를 짤 예정이기에 반환값으로는 같은 키 값으로 value를 가져왔다.

  • Test Code
@SpringBootTest
class RedisServiceTest {

    @Autowired
    RedisService redisService;

    @Test
    void redis값저장_불러오기(){
        String uid = UUID.randomUUID().toString();
        String getRedisValue = redisService.redisString(uid);
        Assertions.assertThat(uid).isEqualTo(getRedisValue);
    }

}

UUID를 통해 값을 랜덤적으로 넣어주고 해당 값을 가져오는지 검증테스트를 진행했다.

Reference

https://ko.theastrologypage.com/amazon-elasticache#menu-1
https://aws-hyoh.tistory.com/entry/SAA-27-ElastiCache
https://wildeveloperetrain.tistory.com/21
https://devlog-wjdrbs96.tistory.com/374
https://junghyungil.tistory.com/165
https://jojoldu.tistory.com/418

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640

0개의 댓글