-
[Redis] Redis란 무엇인가?기타 2022. 3. 21. 23:23반응형
이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.
틀리거나 잘못된 정보가 있을 수 있습니다.
댓글로 알려주시면 수정하도록 하겠습니다.
1. Redis
Redis는 인 메모리 Key, Value 데이터 구조의 스토리지입니다. 디스크나 SSD에 데이터를 저장하는 DB 시스템과 다르게 메모리에 데이터가 상주함으로 디스크 액세스 과정이 없어 데이터에 빠르게 액세스 할 수 있습니다.
2. Redis 특징
- Redis는 Single Thread로 구성
Redis는 Single Thread로 구성되어 있어 Race Condition이 발생할 가능성이 낮습니다.
즉 여러 Thread가 데이터에 수정을 위해 경합하여 데이터의 정합성이 깨질 가능성이 낮습니다. - Redis는 Atomic을 보장
Redis의 Collection들은 Atomic을 보장합니다. 하지만 사용자의 실수로 인해 Race Condition이 발생할 수 도 있습니다.
3. Redis Collection 종류
- Strings
가장 기본이 되는 Collection으로 하나의 Key에 하나의 Value를 저장하는 Collection
- set <Key> <Value> 기본적인 Key Value 형태로 데이터를 저장
- get <Key> Key값으로 저장되어 있는 Value값을 조회
- List
Java의 List와 비슷한 Collection으로 하나의 Key에 여러 개의 Value를 저장하는 Collection
- lpush <Key> <Value> 특정 Key로 저장된 List에 가장 앞에 Value를 저장
- rpush <Key> <Value> 특정 Key로 저장된 List에 가장 뒤에 Value를 저장
- lpop <Key> 특정 Key로 저장된 List에 가장 앞에 Value를 조회 조회된 Value는 List에서 제거
- rpop <Key> 특정 Key로 저장된 List에 가장 뒤에 Value를 조회 조회된 Value는 List에서 제거
- Set
Java의 Set과 비슷한 Collection으로 하나의 Key에 여러 개의 Value를 저장할 수 있지만 중복된 Value는 하나의 Value로 취급하는 Collection
- sadd <Key> <Value> 특정 Key로 저장된 Set에 Value를 저장
- smembers <Key> 특정 Key로 저장된 Set에 모든 Value값을 조회
- sismember <Key> <Value> 특정 Key로 저장된 Set에 특정 Value가 저장되어 있으면 1을 반환 없으면 0을 반환
- Sorted Set
Set과 유사한 Collection이지만 스코어 값을 이용하여 정렬이 가능한 Collection- zadd <Key> <Score> <Value> 특정 Key로 저장된 SortedSet에 Value를 저장하고 Score값으로 정렬 만약 특정 Key로 저장된 SortedSet에 Value가 이미 저장되어 있다면 Score값만 변경 변경된 Score값으로 재정렬
- zrange <Key> <StartIndex> <EndIndex> 특정 Key로 저장된 SortedSet에 StartIndex부터 EndIndex의 범위까지 저장된 모든 Value를 조회
- Hash
하나의 Key에 여러 개의 SubKey(Field)와 Value를 가지는 Collection
- hmset <Key> <SubKey> <Value> <SubKey> <Value> .... <SubKey> <Value> 특정 Key로 여러 SubKey와 Value를 저장
- hgetall <Key> 특정 Key로 저장된 모든 SubKey와 Value를 조회
4. Redis 운영
Redis는 메모리를 이용하는 스토리지로 메모리 관리는 필수입니다.
메모리 관리 기본 정보
- Redis는 Physical Memory 이상을 사용할 수 없다.
- Redis도 결국 서버의 가용 가능한 메모리 이상은 사용할 수 없으므로 이 이상의 메모리 사용 시 Swap을 이용합니다. Swap을 이용하면 결국 데이터를 사용하기 위해 디스크에 접근하게 되므로 성능이 느려지게 됩니다.
- Maxmemory를 설정하여도 이보다 더 많은 메모리를 사용할 수도 있다.
- Redis의 경우 메모리 할당을 위해 Jemalloc을 사용합니다. 그런데 Redis의 경우 Jemalloc이 할당하여 사용하는 메모리를 정확히 알 수 없습니다. 바로 메모리 파편화 때문입니다.
- 메모리 파편화 : 메모리 파편화는 Redis가 1byte의 메모리 공간이 필요하여 Jemalloc에 1byte만큼의 메모리 공간을 요청하면 Jemalloc은 메모리의 1Page를 할당하기 때문에 Redis는 실제 1Byte를 사용하여도 메모리는 1Page를 이용하는 것과 같습니다. 만약 1Page가 100Byte면 Redis는 1Byte를 사용하지만 실제 메모리 사용은 100Byte가 되는 것입니다.
- RSS 값을 지속적으로 모니터링하여야 한다.
메모리 부족 해결
- 메모리가 더 많은 장비로 Migration 진행
- 메모리가 더 많은 장비로 Migration을 진행하는 도중에 Error가 발생할 수 있습니다. 이유는 Migraion을 진행하기 위해 Redis는 Fork를 사용한다 이때 Fork가 되면 메모리는 현재 사용량은 2배가 되게 된다. 그럼 현재 사용량이 2GB 인대 Physical Memory가 3GB라면 Fork를 진행하면 4GB의 메모리가 필요하지만 최대 메모리는 3GB로 당연하게도 Error가 발생할 것입니다.
- 저장된 데이터 삭제
- 일정한 메모리 사용을 위해 저장된 데이터 중 일부를 삭제하여 관리
- 만약 Swap이 발생한 데이터가 있는 경우 불필요한 데이터를 줄인 뒤 반드시 Redis 재시작이 필요합니다. 한번 Swap이 된 데이터는 재시작을 하지 않으면 항상 Swap이 발생하므로 불필요 데이터를 삭제하여도 Swap은 여전히 발생할 확률이 높습니다.
- ZipList를 이용
- ZipList는 조회 시 특정한 알고리즘을 사용하여 탐색하는 것이 아닌 선형 탐색을 이용하여 필요한 데이터를 조회하는 방법입니다. 이 경우 특별한 Collection이 필요하지 않으므로 메모리 사용량을 조금 아낄 수 있습니다.
- 선형 탐색이 가능한 이유는 In-memory 저장소 이기 때문입니다. 아주 많은 데이터가 아니면 알고리즘을 이용한 탐색과 선형 탐색의 속도 차이가 미비하기 때문에 사용이 가능한 방법입니다.
5. 명령어 사용 주의
Redis는 Single Thread로 구현되어 있습니다. 그러므로 동시에 처리 가능한 명령 또한 1개입니다.
만약 1개의 명령을 수행하는데 10초의 시간이 걸리면 Buffer에 대기 중인 다른 명령들은 10초를 기다린 이후에 처리될 것입니다.
이때 Timeout 속성이 1초로 되어 있다면 1개 명령을 수행 하는 중 나머지 명령은 모두 타임아웃이 발생하는 경우가 생기게 됩니다.
결론적으로 Redis의 경우 하나의 명령이 긴 시간이 필요한 명령은 수행해서는 안됩니다.
대표적인 명령
- Keys : 저장된 모든 Key를 조회하는 명령어
Keys의 경우 Scan이라는 명령어로 대체하여 사용이 가능합니다. - get all collection : Collection의 모든 데이터를 조회
get all collection의 경우 Sorted Set의 경우 zrange를 이용하여 작은 단위로 조회
나머지 Collection의 경우 작은 단위로 Collection을 분리하여 저장하여 사용
Redis 명령 처리 과정
TCP 통신의 경우 Packet 단위로 데이터가 전송 되므로 Process Input Buffer에는 전송된 Packet들이 모이게 되고 모인 Packet을 조합하여 처리하고자 하는 데이터가 완성되면 Packet들을 조합하여 Command로 변경을 합니다.
그리고 Process Command에서 해당 Command를 처리하게 됩니다.
반응형'기타' 카테고리의 다른 글
[Slack] SpringBoot Slack Message 전송 (0) 2022.04.07 [ElasticSearch] Windows 설치 및 실행 (0) 2022.04.07 [AWS] Amazon Linux2 Redis 설치 (7) 2022.03.15 [AWS] Amazon Linux2 Timezone 변경 (0) 2022.03.13 [AWS] EC2 CodeDeploy Agent 설치와 Ruby Error (0) 2022.03.12 - Redis는 Single Thread로 구성