[데이터베이스] Redis

미누·2024년 3월 1일

CS_데이터베이스

목록 보기
8/8

Redis란 무엇일까?

Redis는 Memcached와 비슷한 캐시 시스템으로서 동일한 기능을 제공하면서 영속성, 다양한 데이터 구조와 같은 부가적인 기능을 지원하고 있습니다. 레디스는 모든 데이터를 메모리에 저장하고 조회합니다.
즉, 인메모리 데이터베이스 입니다. 이 말만 들으면 Redis에 모든 데이터를 메모리에 저장하는 빠른 DB가 다라고 생각할지도 모릅니다. 하지만 빠른 성능은 레디스의 특징 중 일부분 입니다. 다른 인메모리 디비들과의 가장 큰 차이점은 레디스의 다양한 자료구조 입니다.

이렇게 다양한 자료구조를 지원하게 되면 개발의 편의성이 좋아지고 난이도가 낮아진다는 장점이 있습니다.
예를들어, 어떤 데이터를 정렬을 해야하는 상황이 있을 때, DBMS를 이용한다면 DB에 데이터를 저장하고, 저장된 데이터를 정렬하여 다시 읽어오는 과정은 디스크에 직접 접근을 해야하기 때문에 시간이 더 걸린다는 단점이 있습니다. 하지만 이 때 In-Memory 데이터베이스인 Redis를 이용하고 레디스에서 제공하는 Sorted-Set이라는 자료구조를 사용하면 더 빠르고 간단하게 데이터를 정렬할 수 있습니다.


NoSQL로서 Key-Value 타입의 저장소인 레디스(Redis, Remote Dictionary Server)의 주요 특징은 아래와 같습니다.

  • 영속성을 지원하는 인메모리 데이터 저장소
  • 읽기 성능 증대를 위한 서버 측 복제를 지원
    • Redis는 기본적으로 단일 스레드로 동작합니다. 이는 하나의 요청을 처리할 때까지 다른 요청을 처리하지 않는다는 것을 의미합니다. 따라서 복잡한 쿼리나 대량의 읽기 요청이 있을 경우 단일 인스턴스에서는 읽기 성능이 제한될 수 있습니다.
    • 서버 측 복제를 사용하면 마스터 서버에서 변경된 데이터를 복제하여 여러 개의 슬레이브 서버에 동기화합니다. 이를 통해 읽기 요청을 분산시키고 로드 밸런싱을 수행할 수 있습니다. 각 슬레이브 서버는 독립적으로 읽기 요청을 처리하므로 읽기 성능이 병렬로 증가합니다.
  • 쓰기 성능 증대를 위한 클라이언트 측 샤딩(Sharding) 지원
    • 샤딩은 데이터를 여러 개의 물리적인 노드에 분산하는 것을 의미합니다.(파티셔닝) Redis에서는 클라이언트 측 샤딩을 통해 데이터를 여러 개의 Redis 인스턴스에 분산할 수 있습니다.
    • 이를 통해 쓰기 요청을 여러 개의 노드에 분산시켜 병렬로 처리할 수 있습니다. 따라서 쓰기 작업의 처리량이 증가하고 단일 인스턴스에 부하가 집중되지 않아 전반적인 쓰기 성능이 향상됩니다.
  • 다양한 서비스에서 사용되며 검증된 기술
  • 문자열, 리스트, 해시, 셋, 정렬된 셋과 같은 다양한 데이터형을 지원. 메모리 저장소임에도 불구하고 많은 데이터형을 지원하므로 다양한 기능을 구현

그래서 최종적으로 Redis를 한 문장으로 정의하면 아래와 같습니다.

레디스는 고성능 키-값 저장소로서 문자열, 리스트, 해시, 셋, 정렬된 셋 형식의 데이터를 지원하는 NoSQL이다.

Redis 영속성

레디스는 지속성을 보장하기 위해 데이터를 DISK에 저장할 수 있습니다. 서버가 내려가더라도 DISK에 저장된 데이터를 읽어서 메모리에 로딩을 합니다.
데이터를 DISK에 저장하는 방식은 크게 두 가지 방식이 있습니다.
RDB(Snapshotting) 방식

순간적으로 메모리에 있는 내용을 DISK에 전체를 옮겨 담는 방식

AOF (Append On File) 방식

Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태

Redis 자료구조

Strings

Strings 타입은 Redis의 가장 기본적인 Type 입니다. 일반적으로 우리가 알고 있는 Key-value 형식을 따르고 있습니다. key와 value 모두 binary safe 하기때문에 어떠한 데이터의 종류도 key, value의 값이 될 수 있습니다.
아래는 Strings 명령어의 특이사항 및 활용방법입니다.
  • 값의 최대 길이는 512MB입니다.
  • INCR, DECR, INCRBY 명령어를 통해 Atomic counters를 구현할 수 있습니다. Atomic Counter란 thread safe한 counter라 생각해 주시면 됩니다.
    • thread safe란 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다
  • APPEND 명령어를 통해 값에 어펜드가 가능합니다.
  • GETRANGE, SETRANGE 명령어를 통해 값에 랜덤 엑세스가 가능합니다. 랜덤 액세스란 값의 어느 위치든 index를 통해 접근 할 수 있는 기능입니다.
> set mykey somevalue
OK
> get mykey
"somevalue"
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

Lists

Lists는 Linked List와 유사한 형태로 데이터가 저장되는 Redis에서 제공하는 자료구조입니다. 따라서 처음과 마지막 부분에 element를 추가 / 삭제 / 조회하는 것은 O(1)의 속도를 가지지만 중간의 특정 index 값을 조회할 때는 O(N)의 속도를 가지는 단점을 동일하게 가지고 있습니다
중간에 있는 index값을 가져와야할 경우가 많다면 Sorted Set 자료구조를 추천드립니다.

아래는 Lists 명령어의 특이사항 및 활용방법입니다.

  • 소셜네트워크에서 타임라인과 같은 기능을 구현할 때 LPUSH를 통해 제일 첫 부분에 Insert하며 LRANGE 명령어를 통해 일정 크기를 고정적으로 빠르게 반환할 수 있습니다.
  • LPUSH 명령어와 LTRIM 명령어를 함께 사용하면 Lists의 크기를 항상 일정하게 고정시킬 수 있습니다.
  • LPUSH와 RPOP을 이용한다면 message를 전달하는 queue로 사용할 수 있습니다.
> rpush mylist A
(integer) 1 # 들어있는 element 수 반환
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1 # 0을 기준으로 -1은 마지막, 1은 다음번째, -2는 마지막에서 2번째
                     # 이 예제는 처음부터 끝까지 
1) "first"
2) "A"
3) "B"
> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 6
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "foo bar"
> rpush mylist a b c
(integer) 3
> rpop mylist
"c" # 삭제되넌 것 반환
> rpop mylist
"b"
> rpop mylist
"a"

Sets

Redis Sets는 순서가 보장되지않는 Strings의 집합 자료구조입니다. 기본적으로 추가, 삭제, element의 존재 유무확인 등에 대해서 O(1)의 속도를 보장합니다. 또한 Set 이기 때문에 동일한 value는 추가한다고 해서 2개가 공존하지 않습니다.

아래는 Sets 명령어의 활용방법입니다.

  • 트래킹에 사용될 수 있습니다. 블로그에 접근한 IP 리스트를 관리하고자 할 때 중복을 허용하지 않는 Sets 자료구조를 활용한다면 좋을 결과를 얻을 수 있을 것입니다.
  • 모든 태그를 나타내는 리스트에도 사용될 수 있습니다. 각 포스팅마다 태그가 있고 해당 태그의 모든 리스트를 보고 싶을 때 중복이 허용되지 않는 Set은 사용하기 좋은 자료구조 일 수 있습니다.

Hashes

Redis의 Hashes는 value로 또 다른 key-value Map을 가지는 자료구조입니다.

Sorted sets

Redis의 Sorted sets 자료구조는 Sets 자료구조에 Score를 추가로 기록하여 score가 낮은순서부터 높은순서대로 정렬되는 자료구조입니다. 동일한 값은 오지 못하며 Score는 동일할 수 있다는 사실을 명심하셔야합니다.

아래는 Sorted Sets 명령어의 특이사항 및 활용방법입니다.

  • 온라인 게임의 랭킹에 사용될 수 있습니다. ZADD 명령어를 통해 score와 이름을 함께 보내면 쉽고 빠르게 정렬되고 유일값을 가지는 자료구조를 만들 수 있습니다. 또한 찾을때는 ZRANK, ZRANGE 명령어를 이용할 수 있습니다.
  • Sorted Sets는 자주 Redis에 저장된 데이터의 index를 저장하기 위해서 사용되기도 합니다.hashes에 user를 담아둔다고 한다면 이 값을 나이순으로 정렬하던지 할 수 있는 것입니다.
> zadd hackers 1940 "Alan Kay" # sorted Sets 자료구조로 추가
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer) 1
> zadd hackers 1953 "Richard Stallman"
(integer) 1
> zadd hackers 1949 "Anita Borg"
(integer) 1
> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
> zadd hackers 1914 "Hedy Lamarr"
(integer) 1
> zadd hackers 1916 "Claude Shannon"
(integer) 1
> zadd hackers 1969 "Linus Torvalds"
(integer) 1
> zadd hackers 1912 "Alan Turing"
(integer) 1
> zrange hackers 0 -1 # score를 통한 범위 검색
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"
6) "Richard Stallman"
7) "Sophie Wilson"
8) "Yukihiro Matsumoto"
9) "Linus Torvalds"

참고

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/Redis.md
https://sabarada.tistory.com/134

0개의 댓글