DBMS/Redis

[Redis] Redis 세미나 정리

반응형
우아한 Redis 세미나를 보고 제가 필요한 부분 위주로 정리한 글입니다.

 

Redis 특징


In-Memory Data Store

  • 메모리에서 데이터를 처리하므로 빠른 속도.

다양한 자료구조를 지원

  • Strings, set, sorted-set, hashes, list

Single Thread

  • O(n) 명령어를 주의해야 한다.

Redis 자체가 Atomic을 보장해준다. (싱글 스레드라)

  • Lost update 등 문제가 발생하지 않는다. (잘못 사용하는 경우 제외)


Cache 구조


Look aside Cache


Write Back

  • 쓰기가 빈번한 작업에서 사용.
  • 일단 캐시에 저장해뒀다가, 특정 시점마다 한 번에 DB에 저장하는 구조.

단점

  • 휘발성인 메모리에 먼저 저장해두기 때문에, 장애가 발생하면 데이터가 사라지는 문제를 주의해야 한다.
  • ex) 로그를 DB에 저장할 때 Write Back이 유용하게 사용된다.
  • 혹은 극단적으로 쓰기 작업이 비싼 작업인 경우 사용된다.


memCached vs Redis


memCached는 컬렉션을 지원하지 않는 반면에 Redis는 컬렉션을 지원하는 장점

  1. 예를 들어서 랭킹 서버를 직접 구현하는 경우
    • 가장 간단한 방법: DB에 유저의 Score를 저장하고 Score로 order by로 정렬 후 읽어오는 방법
      • 하지만 이 방법은 개수가 많아지면 속도에 문제가 발생할 수 있다. (디스크를 사용하기 때문에)
    • Redis의 Sorted Set을 이용하면 랭킹을 구현할 수 있음.
    • 친구 리스트를 Key/Value 형태로 저장해야 하는 경우
    • 변경 유실이 발생할 수 있음.
    • Redis의 경우에는 자료구조가 Atomic 하기 때문에, 해당 Race Condition을 피할 수 있음.

⇒ 외부의 Collection을 잘 이용하는 것으로, 여러 가지 개발 시간을 단축시키고, 문제를 줄여줄 수 있기 때문에 Collection이 중요.


Redis 사용처


  1. Remote Data Store: 여러 서버에서 데이터를 공유하고 싶을 때
  2. 인증 토큰 등을 저장
  3. Ranking 보드로 사용
  4. 유저 API Limit


Redis Collections


Strings

  • 기본 키: 키를 어떻게 잡을 것인가를 고려해야 함 (Prefix)
  • 멀티 키

cf) SQL → Redis

insert into users(name, email) values ('will', "will.seungho@gmail.com');


List

  • Lpush, Rpush, LPop, RPop으로 양방향 큐라고 생각하면 될 듯.


Set

  • 중복 허용 X
  • SADD
    • Value가 이미 Key에 있으면 추가되지 않음
  • SMEMBERS
    • 모든 value를 돌려줌
  • SISMEMBER
    • value가 존재하면 1, 없으면 0

Sorted Set

  • Set + 순서 유지 (score를 기반으로 정렬)
  • 랭킹에 따라 순서가 바뀌길 바란다면...!
  • ZADD
    • Value가 이미 Key에 있으면 해당 Score로 변경된다
  • ZRANGE

여기서 Score는 정수형이 아니라 실수형임.

  • 값이 정확하지 않을 수 있다. (근사치로 계산하기 때문에)


Hash


Redis 운영


메모리 관리를 잘하자.

  • Redis는 In-Memory Data Store.
  • Physical Memory 이상을 사용하면 문제가 발생.
    • Swap이 있다면 Swap 사용으로 해당 메모리 Page 접근시 마다 늦어짐 ⇒ 성능이 확 느려짐.
    • Swap이 없다면 OOM 발생으로 장애 발생
  • Maxmemory를 설정하더라도 이보다 더 사용할 가능성이 큼.
    • cf) Maxmemory: 최대 사용 Memory를 사용하도록 설정하는 옵션.
  • 많은 업체가 현재 메모리를 사용해서 Swap을 쓰고 있다는 것을 모를때가 많음.
  • 큰 메모리를 사용하는 인스턴스 하나 보다는 적은 메모리를 사용하는 인스턴스 여러 개가 안전하다.
    • Redis는 필연적으로 Master-Replication 구조에서 fork()를 하게 된다.
    • fork()를 할때 READ가 많은 서비스는 문제가 없지만, WRITE가 많은 서비스는 최대 메모리의 2배까지 사용할 수 있음. (COW (Copy On Write) 방식으로 사용하기 때문에)


메모리가 부족할 때는?

  • 좀 더 메모리 많은 장비로 마이그레이션.
  • 있는 데이터를 줄이기
    • 데이터를 일정 수준에서만 사용하도록 특정 데이터를 줄임.


O(n) 관련 명령어는 주의하자

  • Redis는 Single Thread. → Redis가 동시에 처리할 수 있는 명령은 1개.
  • 참고로 단순한 get/set의 경우, 초당 10만 TP 이상 가능.
  • keys
  • flushall, flushdb
  • delete collections
  • get all collections
반응형

'DBMS > Redis' 카테고리의 다른 글

Redis에서 트랜잭션 처리 방법  (0) 2022.12.22
[Redis] Redis 운영 관리 정리  (0) 2021.10.26