본문 바로가기

CS

Redis

레디스는 NoSql 데이터베이스 OS 이다.

  • 레디스의 개요
  • 레디스의 개념
  • 레디스의 자료구조
  • 사용시 주의 사항

개요

19.07.24 오전에 쿠팡에서 물품들이 다 매진이된 사례가 있었습니다.

이떄 쿠팡 서비스의 오류의 원인은 레디스 db의 문제 였다.

레디스란 remote dictionary server로

원격 HashMap(key -value) 서버 라는 뜻이다.

32bit cpu의 int 최대값은 21억4738만 3647이다.

이때 저 숫자 범위를 넘어서서 오류가 발생 했던 것이다.

그래서 그 이후에 레디스가 int을 long 형태로 변경하는 패치 사항도 있었다.

개념

레디스는 in memory database 구조 이다.

이때 cache를 사용하는데

cache의 정의란 - 나중에 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것이다.

그럼 이런 데이터들을 어디에 저장하는지를 알아야 하는데

이 피라미드 형태를 보게 되면 위로 올라갈수록 값을 비싸지고 속도도 빨라진다. 반대로 밑으로 내려갈수록 값은 싸지고 속도도 느려진다.

캐시는 다른 말로 SRAM이라고 한다. 맥북 옵션에서 SRAM을 본적이 있을 것이다.

Main Memory는 적당히 빠르고 적당히 비싸다는 특징을 가지고 있다. # 휘발성(DRAM)

하드 디스크 512GB 이런것을 뜻하고 저렴하고 , 묵직하다 많은 데이터들을 저장하는데 있어 탁월하다 # 비휘발성 이다.

여기서 레디스는 SRAM을 이용해 Database 보다 더 빠른 Memory를 이용해 데이터를 저장하는 OS 이다.

자료구조

레디스에서는 다양한 자료구조를 제공하는데

Map, HashMap, Set, List, 등등을 제공한다.

그런데 자바에도 이런 기능들을 제공을 하는데 왜 그런걸 쓰지 않지 라는 생각을 할 수도 있다. 그 이유는

서버가 여러대인 경우 Consistency의 문제들이 발생하기 때문이다. (일관성)

각자 저장하고 있는 Key 값이 달라지면 큰 문제가 발생 할 수 있다.

레디스는 기본적으로 싱글 스레드를 사용하고

레디스의 자료구조는 Atomic Critical Section에 대한 동기화를 제공 하다.

여기서 Atomic이란 명령을 수행하는데 있어, 완료 , 미실행, 만을 수행 한다. 또한 순차적인 명령을 수행하여 서로가 서로에게 겹치지 않고 문제를 발생시키지 않는다.

// 파이썬에서 
import redis
r = redis.Redis("localhost")

r.exists("key1") # 이런식으로 있는지 없는지 확인을 한다.
// 스프링 부트에서
@Autowired
StringRedisTemplate redisTemplate;

@Test
public void testStrings() {
    final String key = "sabarada";

    final ValueOperations<String, String> stringStringValueOperations = redisTemplate.opsForValue();

    stringStringValueOperations.set(key, "1"); // redis set 명령어
    final String result_1 = stringStringValueOperations.get(key); // redis get 명령어

    System.out.println("result_1 = " + result_1);

    stringStringValueOperations.increment(key); // redis incr 명령어
    final String result_2 = stringStringValueOperations.get(key);

    System.out.println("result_2 = " + result_2);
}

사용되는 곳

여러 서버에서 같은 데이터를 공유 할 때,

단일 서버 라면 Atomic 자료구조 & Cache를 사용 할때 사용하면 좋을 것 이다.

캐시를 사용하기때문에 데이터베이스를 조회할때의 i/o보다 훨씬 빠르다, SRAM을 사용하기에 서버를 끄면 사라진다는 단점이 있어 보조 데이터베이스로 사용되는 것이 보편적이다.

주의사항

레디스를 사용할때 주의 사항이라면 싱글 스레드이기 때문에 시간 복잡도에 예민하다.

그래서 O(N)이 되는 경우 , GetAll, keys, 등의 시간복잡도가 O(N)인 사항에는 주의 해서 사용할 필요가 있다.

 

https://www.youtube.com/watch?v=Gimv7hroM8A&t=659s

 

'CS' 카테고리의 다른 글

Git Branch 종류  (1) 2024.11.26
Http와 Https  (1) 2024.09.27
원자성,가시성  (0) 2023.02.02
동기화 , 비동기화  (0) 2023.01.21
싱글톤(Singleton) 패턴이란?  (0) 2023.01.09