Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 스프링 핵심 원리 이해
- kotlin in action 정리
- 백준
- 객체 지향 설계와 스프링
- 스프링 핵심 원리
- 컨베이어 벨트 위의 로봇 Python
- 코틸린인액션
- 20055 컨베이어 벨트 위의 로봇
- Kotlin in action 6장
- 자바 ORM 표준 JPA 프로그래밍 7장
- Kotlin in action 5장
- KotlinInAction
- 기능개발 python
- 코틀린인액션
- 싱글톤 컨테이너
- Kotlin In Action
- 백준 20055 컨베이어 벨트 위의 로봇
- Kotlin in action 3장
- 백준 13460 Python
- 13460 구슬탈출 2
- 고급매핑
- 스프링 컨테이너와 스프링 빈
- Kotlin in action 10장
- 20055
- 스프링 핵심 원리 - 기본편
- spring
- 코틀린
- Kotlin
- 7장 고급매핑
- Python
Archives
- Today
- Total
기록하는 습관
[Research] Redis 조사 본문
0. redis 자료 구조
- Hashes
- Every hash can store up to 232 - 1 field-value pairs (more than 4 billion). → key 1개 당, 약 42억개의 field-value 저장 가능.
- Sets
- The max number of members in a set is 232 - 1 (4294967295, more than 4 billion of members per set). → key 1개 당, 약 42억개의 member 저장 가능.
- 참고
1. bulk Insert
MySQL에서는 bulk insert를 지원하지만 Redis에서는 따로 지원하지 않음.
방법 | 개념 | 장점 | 단점 | 비고 |
Redis pipelining |
|
|
|
|
Luke protocol |
|
|
|
|
Lua Script 활용 |
|
|
|
참고
2. bulk Read
- keys
- Redis에 모든 키 값들을 읽어올 수 있는 명령어인 Keys가 있다. 이 명령어는 시간 복잡도가 O(n)이다.
- keys 명령어는 모든 key 를 다 찾을 때 까지 blocking 하기 때문에 다른 client 들의 명령어를 수행 하지 못하고 timeout 발생 할 확률이 높음.
- scan
- count 값을 정하여 그 count 값만큼 결과를 가져오고 offset 값을 반환. (기본 count값은 10)
- 레디스에 읽어야하는 키값이 총 10000개라고 치고 count가 10개이면 1000번에 나눠서 이 키를 읽는 것.
- 커서가 0이 될 때 까지 while문을 돌며 키를 나눠서 읽음.
- count 값을 정하여 그 count 값만큼 결과를 가져오고 offset 값을 반환. (기본 count값은 10)
결론
- zscan 명령어 사용. (sorted set 안에서 key를 가져오는 명령)
- count는 n으로 진행 (측정 후 n 결정예정)
참고
3. bulk Delete
명령어 | 특징 | 성능 (삭제 시간) |
DEL |
|
44,217 microsecond |
UNLINK |
|
25 microsecond |
성능
- key 1개에 약 10만개의 member 넣고 slowlog로 처리 시간 측정.
- 값이 차지하는 메모리는 약 12MB
결론
- unlink 사용
- 삭제 시간이 UNLINK가 약 1700배 빠르다.
- 구조 상, key(groupSeq) 내에 member 수가 많기 때문에 unlink를 사용할 예정.
- → RENAME을 사용하면 자동으로 UNLINK 사용
참고
- flushdb: 연결된 현재 데이터베이스의 키들을 삭제
- flushall: 모든 데이터베이스의 키들을 삭제
- 시간복잡도가 O(n)이기 때문에, 성능 지연 현상을 초래할 수 있음. 운영환경에서 부득이하게 사용할 경우 async 옵션을 적용하여 반영.
- backgroud로 삭제하기 때문에 응답속도가 매우 빠르고, 지연을 방지할 수 있음.
- String key 100만개를 flush 할 경우, Sync는 약 1초 / Async는 1ms 미만내에 명령이 수행됨.
- 시간복잡도가 O(n)이기 때문에, 성능 지연 현상을 초래할 수 있음. 운영환경에서 부득이하게 사용할 경우 async 옵션을 적용하여 반영.
- Docs: unlink
4. 무중단 데이터 교체
방법 | 상세 설명 | 삭제 정책 | 장점 | 단점 |
교체 |
|
|
|
|
version check |
|
|
|
|
rename |
|
|
|
5. Memory 구성
- 별도로 Redis의 설정파일인 redis.conf의 max-memory 설정을 하지 않을 경우 0으로 구성되고, OS에서 사용 가능한 Max Memory까지 확장하여 사용하게 됨.
- Redis 공식 문서에 따르면 32bit 시스템에서는 메모리 제한 사용량 기본값이 3GB로 설정되어 있지만, 64bit 시스템에서는 0. → 64bit 경우 가상메모리까지 사용하게 됨.
- 0인 경우, eviction policy 적용하지 않음.
- 이는 특정 인스턴스의 장애가 동일 노드의 다른 Redis 인스턴스로의 전파를 일으킬 수 있음.
- 특히 물리 메모리를 모두 사용하는 상황이 발생할 경우 스왑 메모리 영역을 사용하게 되는데 이때 Redis의 성능은 상황에 따라 수백배까지 느려질 수 있음.
- 따라서 반드시 max-memory를 설정하여 메모리 사용계획과 저장되는 데이터 LifeCycle을 관리하는 정책을 세워야 한다.
6. 기타
1) 저장 만료 주기
- max-memory만큼 메모리를 사용하게 되면, 메모리 정책에 따라 과거에 만들어진 키들이 삭제된다.
- 이와 같은 문제점을 개선하기 위해 Redis 서버는 4.0 버전부터 LRU(Least Recently Used: 가장 최근에 사용되지 않은 것) 알고리즘과 LFU(Least-Frequently-Used: 가장 적게 사용된 것) 알고리즘을 제공하고 있다.
- Redis가 Export 된 데이터를 삭제하는 정책은 내부적으로 active와 passive 두가지 방법을 사용한다.
- active: 요청된 key가 호출된 시점에 expired 여부를 검증하여 삭제하는 방법
- passive: random으로 key 100개만 반복적으로 스캔해서 지우는 방식이다.
- expired time이 지난 후 클라이언트에 의해서 접근되지 않는 데이터는 active 방식으로 인해서 지워지지 않고 passive 방식으로 지워져야 하는데, 마찬가지로 전체를 scan하는 것이 아니기 때문에 Redis에는 항상 Expired 되었으나 지워지지 않는 Garbage 데이터가 존재할 수 있다는 점을 명심해야 한다.
2) Eviction 정책
- noeviction: 캐시를 지우지 않는 정책이다. 메모리가 maxmemory 이상을 사용하게 되면 error를 발생시킨다.
- allkey: 각 정책에 따라 모든 키를 대상으로 정리한다.
- volatile: 각 정책에 따라 EXPIRE SET에 있는 키들을 대상으로 정리한다.
- LRU
- allkeys-lru: LRU 알고리즘 기반으로 키를 삭제한다.
- volatile-lru: LRU 알고리즘 기반으로 키를 삭제한다.
- Random
- allkey-random: 랜덤하게 키를 삭제한다.
- volatile-random: 랜덤하게 키를 삭제한다.
- LFU
- allkeys-lfu: LFU 알고리즘 기반으로 키를 삭제한다.
- volatile-lfu: LFU 알고리즘 기반으로 키를 삭제한다.
- TTL
- volatile-ttl: TTL이 짧은 순으로 삭제한다.
3) LazyFree 정책
- lazyfree-lazy-eviction : yes
- del → unlink 사용
- lazyfree-lazy-expire : yes
- del → unlink 사용
- lazyfree-lazy-server-del: yes
- set 또는 rename 명령어를 실행하면 내부적으로 DEL 명령어가 실행되면서 블록킹 현상 발생. 이를 막기 위해서는 yes 설정으로 하여 UNLINK로 수행되게 한다.
- slave-lazy-flush
- yes 설정시, 빠른 동기화 진행.
3) Memory Fragment
maxmemory 대비 사용된 메모리 비율이 낮더라도 메모리 조각화로 인해 Redis 인스턴스의 메모리가 부족해질 수 있다. Redis 버전 4.0 이상에서는 activedefrag 구성을 제공한다.
activedefrag를 yes로 설정하면 CPU 사용량이 증가하지만 메모리 조각화를 완화하여 메모리 부족 문제를 해결할 수 있다.
참고
6. Collection 활용
- Redis와 같은 캐시 솔루션은 단일 데이터 조회시 hash key를 기반으로 조회하기 때문에 대부분 조회 성능은 빠르게 처리된다.
- 다만, Redis에는 Memcached와 달리 Collection Type을 제공한다.
- Collection은 대량 데이터 조회에 보다 유용하게 활용될 수 있지만, 단일 Collection에 데이터 100만건을 넣으면 10초, 1천만건을 넣으면 100초씩 걸리는 식으로 시간이 늘어나기 때문에 Collection 당 저장해야 하는 데이터 사이즈는 1만건 미만으로 관리하는 것이 좋다.
'개발 > Research' 카테고리의 다른 글
[Research] Redis 캐싱 전략 (0) | 2022.07.13 |
---|---|
[Research] MySQL Batch Insert (0) | 2022.07.12 |
[Research] Springfox Swagger2 -> Springdoc OpenAPI 3 (0) | 2022.07.12 |
tomcat vs. hikaricp (0) | 2022.07.12 |
배치, 스케줄러 (0) | 2022.07.12 |
Comments