일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- socket.io
- Redux
- 회고
- scrapping
- docker
- 포트포워딩
- express
- javascript animation
- Modal
- 정규표현식
- component
- 웹팩
- cicd
- 반응형웹
- npx
- Recoil
- react
- AWS
- styled-component
- route
- 웹크롤링
- 성능최적화
- go
- CDN
- graphql
- sequelize
- typescript
- Today
- Total
프로그래밍 공부하기
Redis 본문
Redis에 대해 소개하는 영상이다. 나는 평소 'Redis는 캐시로 사용되는 데이터베이스?', '어떻게 이렇게 빠른 속도가 나올 수 있을까?' 와 같은 막연한 생각을 갖고 있었고, 위 영상을 통해 이러한 궁금점들을 어느정도 해결할 수 있었다.
1. Redis(Remote Dictionary server)
Redis는 외부에있는 Dictionary 구조의 서버라는 의미이다. 이 때 Dictionary란 key-value의 쌍으로 된 데이터 구조를 의미한다. Redis는 기본적으로 key를 입력하면 그에 해당하는 value(데이터)를 리턴하는 구조인 것이다.
2. 다양한 자료구조 지원
[Redis의 자료구조]
- string: 키 하나에 문자열을 저장한다.
- list: Linked List
- set: 순서가 보장되지 않으며 중복이 허용되지 않는 집합
- sorted set(tree set): 가중치가 있는 set.
- hash: 키 하나에 키와 값이 쌍으로 이루어진 데이터 저장
Redis는 다양한 자료구조를 제공한다. 자세한 설명은 이곳이 잘 정리되어있다.
3. In-Memory
Redis는 In-Memory Data Structure Store다. 즉, 데이터를 메모리에 저장한다는 것이다. 이 때문에Redis는 빠르게 접근할 수 있는 것이다. 여기서 코드에서 객체로 저장하는 것과는 무엇이 다를까? 라는 의문이 들 수 있다. 코드에서 객체로 저장하는 경우 1. 서버가 여러 대인 경우 일관성 문제가 발생할 수 있으며, 2. 멀티 스레드에서는 Race Condition 문제가 발생할 수 있다.
3-1. Race Condition / 일관성 문제
Race Condition이란 여러 개의 프로세스/스레드가 하나의 공유자원에 동시 접근할 때 접근 순서에 따라 실행 결과가 달라질 수 있는 상황을 의미한다. Redis는 Single Thread로 되어있어 최대한 하나의 자원에 여러 스레드가 동시 접근하지 않도록 하고 있다. 또한 Redis의 자료구조는 Atomic한 성질을 갖고 있어, Critical Section(여러 프로세스가 동시에 접근하면 안되는 구역)에 대한 동기화를 제공하고 있다.(Atomic한 Transaction이 원치 않는 Read/Write 동기화)
서버가 여러 곳에 있다는 것은 각 서버의 데이터가 일치하지 않는다는 위험성을 내재하고 있다. Redis는 앞서 말했듯이 자료구조가 Atomic한 성질을 갖고 있기 때문에 데이터의 일관성을 보장한다.
4. 사용 시 주의점
Redis는 SingleThread이다. 따라서 오랜 시간이 걸리는 동작을 수행하면 다음 작업은 그동안 대기할 수밖에 없다. 따라서 Redis는 O(N)의 명령어(KEYS, Flush, GetALL)연산은 production에서 사용하지 않는 것을 권장한다.
Redis는 메모리에 데이터를 저장한다. 따라서 메모리 관리에 주의하여야 한다. 메모리 파편화, 가상 메모리 Swap, Replication/Fork가 그것이다.
메모리 파편화는 메모리 할당-해제 시 비어있는 부분이 연속되어있지 않고 파편화 되어있는 것이다. 따라서 전체적으로 보았을 때 메모리에 프로세스가 적재할 공간이 충분한데 이 공간이 연속되지 않고 떨어져 있기 떄문에 프로세스를 적재하지 못하는 현상이 발생할 수 있다.
메모리 용량 이상의 프로그램을 수행하기 위해 프로그램은 전체 프로세스를 적재하는 것이 아닌 일부 프로세스(page 단위)만 메모리에 적재시키고, 다른 프로세스가 필요한 상황에 메모리에서 Swap한다. 이 것이 가상메모리 Swap이다. 이 Swap 과정에서 자원이 소모되므로 가상메모리를 사용할 것인지를 결정해야 한다.
RAM은 휘발성이 있는 저장공간이다. 따라서 데이터가 유실될 수 있음에 주의하여야 한다. Redis는 데이터를 복사해서 다른 Redis 서버나 HDD에 저장할 수 있다. 이 때 Redis는 자식프로세스를 만들어 메모리 상에서 데이터를 복제(Fork)한다. 이 방법은 메모리가 가득 차있다면 복제가 제대로 되지 않으므로 메모리를 항상 여유있게 사용해야 한다.
5. 활용
Redis는 기본적으로 조회수와 같이 수많은 I/O를 반복해야하는 데이터를 캐싱처리하기 위해 사용된다(조회수는 반드시 Consistency를 만족할 필요가 없는 데이터이기도 하다). 그 외에도 API 캐싱, 좋아요 기능(한 명의 사용자는 하나의 댓글에 한 번만 좋아요 가능하다 -> Set 자료구조), 최근 검색어 목록(Sorted Set 자료구조), 세션 저장소(scale-out 용이함) 등이 있다.
6. 공부 키워드
[Redis 공부 키워드]
- Redis를 저장소처럼: Redis Persistent, RDB, AOF
- Redis Scale out / Backup: Redis Cluster
- 부하분산: Constant Hashing
- 데이터 그리드(DB안쓰고 In Memory DB만 쓰기): Spring Gemfire, Hazelcast
Redis에 대해 더 자세히 알고 싶다면 위 키워드들을 공부해보자.
Redis 활용 자세히: https://brunch.co.kr/@skykamja24/575
'감상문' 카테고리의 다른 글
HTTP/1.1, HTTP/2, QUIC (0) | 2021.06.19 |
---|---|
UI/UX 차이 & UX 디자인 과정 (0) | 2021.06.11 |
FE 인싸들이라면 알고 있어야 하는 프레임워크 기술들 (0) | 2021.05.28 |
JavaScript Bundle Diet (0) | 2021.05.23 |
오늘부터 나도 FE 성능분석가 (0) | 2021.05.10 |