본문 바로가기

Web/웹 상식

Redis에 대해서

Redis는 무엇일까?

정의는 메모리 기반의 Key-Value 구조의 데이터 관리 시스템

 

Memcache와 차이점

그리고 종종 MemCache와 종종 비교됩니다. 그럼 MemCache를 잠시 살펴봅시다. MemCache의 특징들은 아래와 같습니다.

  • 처리속도가 빠르다 => 디스크를 거치지 않기 때문에 빠르다
  • 휘발성을 가진다 => 프로세스가 죽거나 장비가 꺼지면 데이터가 사라진다
  • 메모리를 재사용한다 => 메모리가 부족하면 LRU 알고리즘에 의해 데이터가 사라진다

그리고 MemCache와 비교되는 Redis도 위와 같은 특성을 그대로 가지게 됩니다. 하지만 조금씩 다릅니다.

Redis와 MemCache의 차이점

  • 데이터를 메모리 + 디스크 혹은 다른 서버 메모리에 저장한다. 따라서 프로세스가 죽어도 데이터가 저장될 수 있다.
  • 문자열만을 지원하는 MemCache와 다르게 여러 자료구조를 추가로 지원한다.
  • 메모리를 재사용하지 않는다.

Redis의 장점

  • RDBMS 보다 읽기 성능이 빠르다
    • RDBMS 보다 읽기 성능은 빠르지만 수정, 삭제에 불리하다.
    • Memcache 보다 읽기 성능은 비교적 느리나 수정, 삭제는 월등히 빠르다.
  • Key-Value 구조를 사용해서 빠른 속도
  • Value에 다양한 자료구조 지원
    • String, Lists, Sets, Sorted sets, Hashs 지원
  • 다양한 API 지원
  • Single Thread
    • 하나의 서버에 여러대의 Redis를 띄울 수 있다.
    • Master - Slave 형식으로 구현 가능해서 백업이 가능하다.

Redis의 단점

  • 메모리 파편화가 발생하기 쉽다.
    • copy-on-write 방식을 사용하기 때문에 새로 변경된 메모리 페이지를 복사해서 사용하여 변경을 적용한다. 따라서 메모리가 실제 사용량보다 추가로 더 필요하다.
  • 대규모 데이터에 대한 응답 속도의 불안정성

Spring Boot에서의 예시

Spring Boot에서 간단하게 사용하는 방법을 소개하고자 합니다. Spring Boot와 Maven을 사용했습니다.

  • Dependency 추가
    • <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
          <version>2.5.0</version>
      </dependency>
  • StringRedisTemplate 이용
    • @RestController
      public class RedisController {
          private final StringRedisTemplate redisTemplate;
          
          public RedisController(StringTemplate redisTemplate) {
          	this.redisTemplate = redisTemplate;
          }
          
          @RequestMapping
          public void testRedis() {
          	//ValueOperation
          	ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
              valueOperations.set("Key", "Value");
              
              System.out.println(valueOperations.get("Key"));
              
              //ListOperation
              ListOperations<String, String> listOperations = redisTemplate.opsForList();
              listOperations.rightPush("List Key", "List Value");
              
              System.out.println(listOperations.range("List Key", 0, 10));
              
              //SetOperation
              SetOperations<String, String> setOperations = redisTemplate.opsForSet();
              setOperations.add("Set Key", "Set Value");
              
              for (String member : setOperations.members("Set Key")) {
              	System.out.println(member);
              }
              
              //zSetOperation
              ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();
              zSetOperations.incrementScore("Sort Set Key", "Sort Set Value", 1);
              
              zSetOperations.rangeByScore("Sort Set Key", 0, 4).forEach(System.out::println);
          }
      }

 

아주 간단하게만 예제를 작성해봤습니다. 활용방법은 무궁무진하니까요 각자의 환경에 맞춰서 Redis를 사용해보시면 좋을 것 같습니다 ㅎㅎ

반응형