본문 바로가기

Redis

[DB] Redis란?

In-Memory-Cache

데이터의 원본이나 원본 데이터를 통해 연산된 값을 메모리에 미리 저장(복사)해두는 것을 의미한다.

가장 많이 사용되는 In-Memory Key-Value Store는 다음과 같다.

* Key-Value Store란 데이터를 지칭하는 Key와 이에 대한 데이터를 저장하는 Value 구조로 데이터를 저장하는 형태이다.

* Key로 Value(데이터)를 찾을 수 있는 구조

  • Redis
    • 많은 자료구조(Collection)을 제공한다.
    • Replication을 제공해서 서비스를 더욱 안정적으로 사용할 수 있다.
    • Cluster 모드를 제공한다.
    • 메모리 단편화가 발생한다.

  • Memcached
    • Key-Value 형태만 제공한다.
    • Redis에 비해 메모리 관리가 더 안정적이다. -> 자체적으로 Chunk 단위로 메모리를 관리한다.
    • Replication을 제공하지 않는다.
    • Cluster 모드를 제공하지 않는다.

Redis

  • Redis는 기본적으로 Hash Table 형태이다.
    • 특정 슬롯 (1...)에 데이터가 많이 들어가게 되면 ReBalancing을 통해 슬롯을 늘린다.
  • 주로 Cache를 저장하기 위한 저장소로써 사용된다.
  • 특수한 케이스는 DB 자체를 Redis로 사용한다. -> SQL은 지원하지 않는다.
  • Redis는 Single Threaded 형태로 원자성(Atomic)을 보장한다.
  • 지원 자료 구조
    • Strings
      1. Key-Value를 사용하는 자료구조
      2. Key를 통해서 Data를 저장하고 가져온다.
      3. Key-Value를 저장하는 set 명령과 key를 가져오는 get 명령을 사용한다.
        * set api:ex:1234 "{'name': test}"
        * get api:ex:1234
      4. 기본적인 Hash Table을 사용한다.
    • List
      1. 자료구조 리스트를 Redis에서 제공한다.
      2. 데이터의 중간 추가/삭제가 느리고 Head와 Tail 추가/삭제에는 유용한 데이터 구조이다.
      3. O(n)으로 선형 탐색의 비용이 비싸다.
      4. Queue 형태의 자료구조가 필요할 때 많이 사용한다.
      5. Push/Pop 형태로 데이터를 추가하고 가져온다.
      6. rpop, lpop은 데이터가 없을 시 바로 리턴하지만 brpop, blpop은 데이터가 없을 시 데이터가 생길 때까지 대기한다. 
    • Set
      1. 유일한 값들로 이루어진 집합을 유지하는 자료구조
      2. 중복이 없어야할 때 사용한다.
      3. Sadd 명령어로 데이터를 추가한다.
        * Sadd <key> <item>
      4. smembers 명령어로 Set의 모든 데이터를 가져온다.
      5. Sismember 명령어로 Set에 해당 Item이 있는지 확인한다.
      6. srem 명령어로 해당 Item이 존재하면 삭제한다.
      7. 순서가 없다.
    • Hash
      1. Key 하위에 SubKey를 이용해 추가적인 Hash Table을 제공하는 자료구조
      2. 일반적인 Key/Value 데이터를 특정군의 데이터로 묶고 싶을 때 사용한다.
      3. Hset 명령어로 SubKey에 Value를 추가한다.
        * Hset <key> <subkey> <value>
      4. Hget 명령어로 Value를 가져온다.
        * Hget <key> <subkey>
      5. Hgetall 명령어로 모든 subKey와 value를 가져온다.
    • Sorted-Set (Ranking)
      1. 스코어를 가지는 Set 자료구조
      2. Item들이 랭킹을 가지도록 할 수 있다.
        * A 100, B 90, C 70...
      3. 스코어는 Double 형태로 특정 정수 값을 사용할 수 없다.
      4. Skiplist 자료구조를 이용한다.
        * Skiplist는 Log(n)의 검색 속도를 가지는 리스트 자료구조이다.
      5. ZADD 명령어로 Sorted Set에 item을 추가한다.
        * ZADD <key> <score> <item>
        * Value가 이미 존재하면 해당 Score로 변경된다.
      6. ZRANGE 명령어로 요청한 Range의 item들을 가져온다.
        * ZRANGE <key> <start index> <end index>
        * ZRANGE <key> 0 - 1 모든 데이터를 가져올 수 있다.
      7. ZRANGEBYSCORE 명령어로 요청 Score Range의 item을 가져올 수 있다.
        * ZRANGEBYSCORE <key> <start score> <end score>

Redis Transaction

  • Redis에서 한 번에 실행되는 것을 보장해준다.
  • Multi
    • Exec 가 나올 때까지 명령을 모아서 대기한다.

  • Exec
    • Exec를 실행하면 Multo로 모인 명령이 순서대로 실행된다.
    • Exec를 실행하면 Multi로 모인 명령이 다른 명령의 수행 없이 수행된다.
    • Redis는 Single Threaded 형태로, 다른 명령이 이 동안에 수행되지 않는다.
    • 너무 많은 작업이 존재하면 전체 Redis의 성능이 떨어진다.

예를 들어, Multi, Set A 1234, Set B 123 Exec 를 입력하면 Set A 1234, Set B 123 명령이 한 번에 수행된다.


Redis Pipeline

  • Redis 명령의 수행
    • 응답을 기다리는 동안 Time Gap이 존재한다.
    • set 명령을 백만 번 호출하면 많은 시간이 소요된다.
    • 예를 들어, Set A 1234 -> Time Gap -> Client의 Redis 응답 확인 -> Set B 1234 -> Time Gap ....

  • Time Gap을 없애기 위해서 동기적으로 명령을 보내는 경우 응답을 기다리지 않고 명령을 미리 보내는 방식
  • 실제로 Redis에서 제공하는 기능이 아니라, Library에서 제공하는 방식이다.
  • Async Redis Client라면, Redis Pipeline 기능을 따로 사용할 필요가 없다.
    • Ex) Java -> Lettuce Redis Client

'Redis' 카테고리의 다른 글

Redis + Spring 설정 및 간단한 실습  (0) 2022.11.24
[Redis] Reids 내용 정리  (0) 2022.11.08
Cache란?  (0) 2022.11.06