반응형
우아한 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는 컬렉션을 지원하는 장점
- 예를 들어서 랭킹 서버를 직접 구현하는 경우
- 가장 간단한 방법: DB에 유저의 Score를 저장하고 Score로 order by로 정렬 후 읽어오는 방법
- 하지만 이 방법은 개수가 많아지면 속도에 문제가 발생할 수 있다. (디스크를 사용하기 때문에)
- Redis의 Sorted Set을 이용하면 랭킹을 구현할 수 있음.
- 친구 리스트를 Key/Value 형태로 저장해야 하는 경우
- 변경 유실이 발생할 수 있음.
- Redis의 경우에는 자료구조가 Atomic 하기 때문에, 해당 Race Condition을 피할 수 있음.
- 가장 간단한 방법: DB에 유저의 Score를 저장하고 Score로 order by로 정렬 후 읽어오는 방법
⇒ 외부의 Collection을 잘 이용하는 것으로, 여러 가지 개발 시간을 단축시키고, 문제를 줄여줄 수 있기 때문에 Collection이 중요.
Redis 사용처
- Remote Data Store: 여러 서버에서 데이터를 공유하고 싶을 때
- 인증 토큰 등을 저장
- Ranking 보드로 사용
- 유저 API Limit
Redis Collections
Strings
- 기본 키: 키를 어떻게 잡을 것인가를 고려해야 함 (Prefix)
- 멀티 키
cf) SQL → Redis
insert into users(name, email) values ('will', "will.seungho@gmail.com');
- Using Set
- Set name:will will
- Set email:will will.seungho@gmail.com
- Using mset
- Mset name:will will email: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 |