In-Memory-Cache
데이터의 원본이나 원본 데이터를 통해 연산된 값을 메모리에 미리 저장(복사)해두는 것을 의미한다.
가장 많이 사용되는 In-Memory Key-Value Store는 다음과 같다.
* Key-Value Store란 데이터를 지칭하는 Key와 이에 대한 데이터를 저장하는 Value 구조로 데이터를 저장하는 형태이다.
* Key로 Value(데이터)를 찾을 수 있는 구조
- Redis
- 많은 자료구조(Collection)을 제공한다.
- Replication을 제공해서 서비스를 더욱 안정적으로 사용할 수 있다.
- Cluster 모드를 제공한다.
- 메모리 단편화가 발생한다.
- Memcached
- Key-Value 형태만 제공한다.
- Redis에 비해 메모리 관리가 더 안정적이다. -> 자체적으로 Chunk 단위로 메모리를 관리한다.
- Replication을 제공하지 않는다.
- Cluster 모드를 제공하지 않는다.
Redis
- Redis는 기본적으로 Hash Table 형태이다.
- 특정 슬롯 (1...)에 데이터가 많이 들어가게 되면 ReBalancing을 통해 슬롯을 늘린다.
- 주로 Cache를 저장하기 위한 저장소로써 사용된다.
- 특수한 케이스는 DB 자체를 Redis로 사용한다. -> SQL은 지원하지 않는다.
- Redis는 Single Threaded 형태로 원자성(Atomic)을 보장한다.
- 지원 자료 구조
- Strings
- Key-Value를 사용하는 자료구조
- Key를 통해서 Data를 저장하고 가져온다.
- Key-Value를 저장하는 set 명령과 key를 가져오는 get 명령을 사용한다.
* set api:ex:1234 "{'name': test}"
* get api:ex:1234 - 기본적인 Hash Table을 사용한다.
- List
- 자료구조 리스트를 Redis에서 제공한다.
- 데이터의 중간 추가/삭제가 느리고 Head와 Tail 추가/삭제에는 유용한 데이터 구조이다.
- O(n)으로 선형 탐색의 비용이 비싸다.
- Queue 형태의 자료구조가 필요할 때 많이 사용한다.
- Push/Pop 형태로 데이터를 추가하고 가져온다.
- rpop, lpop은 데이터가 없을 시 바로 리턴하지만 brpop, blpop은 데이터가 없을 시 데이터가 생길 때까지 대기한다.
- Set
- 유일한 값들로 이루어진 집합을 유지하는 자료구조
- 중복이 없어야할 때 사용한다.
- Sadd 명령어로 데이터를 추가한다.
* Sadd <key> <item> - smembers 명령어로 Set의 모든 데이터를 가져온다.
- Sismember 명령어로 Set에 해당 Item이 있는지 확인한다.
- srem 명령어로 해당 Item이 존재하면 삭제한다.
- 순서가 없다.
- Hash
- Key 하위에 SubKey를 이용해 추가적인 Hash Table을 제공하는 자료구조
- 일반적인 Key/Value 데이터를 특정군의 데이터로 묶고 싶을 때 사용한다.
- Hset 명령어로 SubKey에 Value를 추가한다.
* Hset <key> <subkey> <value> - Hget 명령어로 Value를 가져온다.
* Hget <key> <subkey> - Hgetall 명령어로 모든 subKey와 value를 가져온다.
- Sorted-Set (Ranking)
- 스코어를 가지는 Set 자료구조
- Item들이 랭킹을 가지도록 할 수 있다.
* A 100, B 90, C 70... - 스코어는 Double 형태로 특정 정수 값을 사용할 수 없다.
- Skiplist 자료구조를 이용한다.
* Skiplist는 Log(n)의 검색 속도를 가지는 리스트 자료구조이다. - ZADD 명령어로 Sorted Set에 item을 추가한다.
* ZADD <key> <score> <item>
* Value가 이미 존재하면 해당 Score로 변경된다. - ZRANGE 명령어로 요청한 Range의 item들을 가져온다.
* ZRANGE <key> <start index> <end index>
* ZRANGE <key> 0 - 1 모든 데이터를 가져올 수 있다. - ZRANGEBYSCORE 명령어로 요청 Score Range의 item을 가져올 수 있다.
* ZRANGEBYSCORE <key> <start score> <end score>
- Strings
Redis Transaction
- Redis에서 한 번에 실행되는 것을 보장해준다.
- Multi
- Exec 가 나올 때까지 명령을 모아서 대기한다.
- Exec 가 나올 때까지 명령을 모아서 대기한다.
- Exec
- Exec를 실행하면 Multo로 모인 명령이 순서대로 실행된다.
- Exec를 실행하면 Multi로 모인 명령이 다른 명령의 수행 없이 수행된다.
- Redis는 Single Threaded 형태로, 다른 명령이 이 동안에 수행되지 않는다.
- 너무 많은 작업이 존재하면 전체 Redis의 성능이 떨어진다.
예를 들어, Multi, Set A 1234, Set B 123 Exec 를 입력하면 Set A 1234, Set B 123 명령이 한 번에 수행된다.
Redis Pipeline
- Redis 명령의 수행
- 응답을 기다리는 동안 Time Gap이 존재한다.
- set 명령을 백만 번 호출하면 많은 시간이 소요된다.
- 예를 들어, Set A 1234 -> Time Gap -> Client의 Redis 응답 확인 -> Set B 1234 -> Time Gap ....
- Time Gap을 없애기 위해서 동기적으로 명령을 보내는 경우 응답을 기다리지 않고 명령을 미리 보내는 방식
- 실제로 Redis에서 제공하는 기능이 아니라, Library에서 제공하는 방식이다.
- Async Redis Client라면, Redis Pipeline 기능을 따로 사용할 필요가 없다.
- Ex) Java -> Lettuce Redis Client
'Redis' 카테고리의 다른 글
Redis + Spring 설정 및 간단한 실습 (0) | 2022.11.24 |
---|---|
[Redis] Reids 내용 정리 (0) | 2022.11.08 |
Cache란? (0) | 2022.11.06 |