[데이터베이스] Redis

subbni·2023년 1월 31일
0

기본 특징

  1. 외부에서 사용 가능한 key-value 쌍의 해시맵 형태의 서버이다.
    -> 별도의 쿼리 없이 key를 통해 빠르게 데이터를 가져올 수 있다.
  2. In-memory database로, No SQl 데이터베이스 역할을 한다.
    -> 디스크에 데이터를 쓰지 않고 메모리에서 데이터를 처리하므로 작업 속도가 빠르다.

영속성 보장

Redis는 영속성 보장을 위해 데이터를 디스크에 저장할 수 있다.
서버가 내려가더라도 디스크에 저장된 데이터를 읽어서 메모리에 재로딩한다.
저장방식은 크게 두 가지로 나뉜다.
1. RDB (snapshotting) 방식
: 일정 인터벌로 메모리에 있는 내용(데이터) 전체를 디스크에 옮겨 저장한다.
restart 시간이 빠르지만 멈췄을 때 데이터 유실 가능성이 더 높다.
몇 분 정도의 데이터 유실 가능성을 감내할 수 있다면 RDB 방식이 추천된다.
2. AOF (Append On File) 방식
: Redis의 모든 Write/Update 연산 자체를 log 파일에 저장한다.
읽기 쉬운 포멧이지만 RDB보다 용량이 크고, write 리퀘스트가 많을 때 RDB보다 반응성이 느리다.

컬렉션

Redis는 단순한 key-value 쌍(문자열)이 아니라 다양한 데이터 구조체를 지원하는데, 이를 컬렉션이라 부른다.

(출처:https://loosie.tistory.com/803)

이처럼 key 값으로 넣을 수 있는 데이터 구조가 매우 다양하다.

싱글 스레드 사용

싱글 스레드를 사용하여 연산을 원자적으로 처리한다. 따라서 Race Condition에 유리하다.

Race Condition : 공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태

but 빠르게 두 번 요청시 데이터가 두 개 발생하는 등의 더블 클릭 이슈는 싱글 스레드만드로 해결 불가능하다.

운영시 유의사항

사용해선 안 되는 커맨드 : O(n) 소요

Redis는 Single Thread로 동작하므로, 한 사용자가 오래 걸리는 커맨드를 실행하면 나머지 요청들은 전부 대기하게 되어 장애가 빈번히 발생한다. (만일 하나의 명령어가 1초가 걸리는 작업을 하면 남은 명령어는 1초동안 대기하게 되는데 모두 timeout이 발생하여 서비스가 터지게 된다. 보통 timeout = 200~300ms)

따라서 시간복잡도 O(n)가 걸리는 명령어들은 최대한 사용을 삼가야 한다.

자동으로 데이터 비우기

Redis를 캐시로 사용할 때는 Key에 대한 Expire Time을 설정하는 것이 권장된다. 설정하지 않는다면 금방 메모리가 가득차게 된다.
Redis는 데이터가 가득찼을 때 MAXMEMORY-POLICY 정책에 의해 데이터가 삭제된다.

  • noeviction (default) : 메모리가 가득차면 더 이상 새로운 키를 저장하지 않는다. 즉 새로운 데이터 입력이 불가능하기 때문에 장애가 발생할 수 있다.
  • volatile : 가장 최근에 사용하지 않았던 키부터 삭제한다. expire 설정에 있는 키값만 삭제하여, 만약 메모리에 expire 설정이 없는 키들만 남아있다면 위와 같은 장애가 발생할 수 있다.
  • allkeys (권장) : allkeys-lru는 모든 키에 대해 LRU(Least Recently Used) 방식으로 데이터를 삭제한다. allkeys-lfu는 사용 빈도수가 가장 적은 데이터부터 삭제한다. 이 설정을 적어도 MAXMEMORY로 인해 장애가 발생할 가능성은 없다.

Memory 관리

Redis는 메모리를 사용하는 저장소이므로 메모리 관리가 아주 중요하다. 모니터링할 때 유의할 점은 used_memory가 아닌 used_memory_rss값을 보는 것이 중요하다는 것이다.

  • used_memory: 논리적으로 Redis가 사용하는 메모리
  • used_memory_rss: OS가 실제로 Redis에 할당하기 위해 사용한 물리적 메모리 양

실제 저장된 데이터는 적은데 rss값이 큰 경우는 fragmentation이 크다고 말한다. 주로 삭제된 키가 많을 때 이 fragmentation이 증가한다. 이 때 activedefrag 기능을 잠시 켜두면 도움이 된다.

  • CONFIG SET activedefrag yes

출처 : https://loosie.tistory.com/803,
https://steady-coding.tistory.com/586

profile
개발콩나물

0개의 댓글