Redis?
Remote dictonary server
외부(원격) / HashMap(Key - Value) / 서버
업무용으로 별도 서버의 Redis를 많이 활용하게 되지만, 실습의 용이성을 위해
Embedded Redis를 사용하기도 한다.
Database, Cache, Message broker
In-memory Data Structure Store
Supports rich data structure
Redis 사용 목적
- SpinLock을 활용한 동시성 제어
- 동시성 제어를 AOP를 활용하여 실습하는데 활용되는 인프라
Cache
: 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것
그럼, 어디에 저장하는 것이 가장 빠른가?
이것에 대한 이해를 돕기 위해 메모리 대칭 구조에 대해 알아보자.
Memory Hierarchy (메모리 대칭 구조)
위로 갈수록 빠르고 비싸고, 밑으로 갈수록 느리고 저렴한 저장소라고 할 수 있다.
위에서부터 예시를 들면,
CPU Register
i7 CPU - 12MB Cache Memory
16GB DRAM
512GB SSD
CPU Cache - 12MB Cache Memory(SRAM)
: 빠름, 비쌈, 용량 작음(즉, 데이터베이스로 사용하기에는 작은감이 있음)
Main Memory(DRAM) - 16GB DRAM
: 적당히 빠름, 적당히 비쌈, 적당히 큼, 휘발(컴퓨터가 꺼지면 데이터가 전부 날아가는 특징)
Storage(SSD, HDD) - 512GB SSD
: 비교적 느림, 비교적 저렴함, 엄청 큼, 비휘발성
기본적으로 데이터베이스는 컴퓨터가 꺼지더라도 저장되어야 되기 때문에 SSD에 저장하는데
기술이 발달하고, 하드웨어들이 커지다보니 Main Memory에 저장해서 조금 더 빠르고 쉽게 데이터에 접근하면 어떨까?라는 개념으로 나오게 된 것이 바로 Redis이다.
In-memory Database (Cache) - Redis
Database보다 더 빠른 Memory에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하다!
기본 데이터베이스, 캐시, 메시지 브로커 및 대기열로 가장 일반적으로 사용되는 오픈 소스 인메모리 키-값 데이터 저장소이다.
Data Structure
초기에는 String, Bitmap, Bit field, Hashe, List, Set, Sorted Set 정도의 데이터 타입만 제공하다가 버전이 올라가면서 현재는 Geospatial Index, Hyperloglog, Stream까지 지원하고 있다.
그렇다면, Java와 자료 구조에서 어떤부분이 차이가 나는가?
Java - Redis
private final Map<String, Object> 안써ㅠ = new HashMap<>();
HashMap에 데이터베이스로 사용해서 저장해도 메모리 데이터베이스 ..
왜 이것을 안쓰느냐?
서버가 여러대인 경우 Consistency(일관성)의 문제 발생할 수 있다.
Mult-Threaded 환경에서 Race Condition이라는 문제가 발생할 수 있다.
Race Condition이란 여러 개의 *Thread가 경합하는 것
* 프로세스(process) 내에서 실제로 작업을 수행하는 주체
Context Switching에 따라 원하지 않는 결과가 발생할 때가 있다.
Race Condition 해결
Redis는 기본적으로 Single Threaded
Redis 자료구조는 Atomic *Critical Section에 대한 동기화를 제공
* 동시에 프로세스가 여러개가 접근하면 안되는 영역이라고 생각하면 됨
서로 다른 Transaction Read/Write를 동기화함으로써 원치 않는 결과를 막아준다.
어디에 쓰는가?
- 여러 서버에서 같은 데이터를 공유할 때
- Single Server라면? Atomic 자료구조 & Cache
주의해야 할 점
- Single Thread 서버이므로 시간 복잡도를 고려해야 한다.
- In-memory 특성상 메모리 파편화, 가상 메모리등의 이해가 필요하다.
Redis가 왜 Single Threaded로 동작하는가?
- Event Driven (비동기)
- IO-bound Process
- Context Switching의 효율이 적다
- Single Threaded
Single Threaded
Redis는 네트워크로부터 요청을 받아서 명령어를 처리하는데 Command를 형성하고 처리하는 과정이 Single Threaded이기 때문에 Command가 오랜 시간이 걸리는 경우 나머지 요청들이 더이상 받아지지 않고 서버가 다운되는 문제가 발생할 수 있다.
Single Threaded이기 때문에 빨리 처리해야 하고(그만큼 처리가 빨라야 한다), 전체 데이터를 다루는 O(N)의 경우 주의해서 사용해야 한다. (KEYS, Flush, GetAll 연산 주의)
https://developer.redis.com/explore/what-is-redis/
Redis: In-memory database. How it works and Why you should use it | The Home of Redis Developers
Redis is an open source, in-memory data store that delivers sub-millisecond response times and is used as a primary database, cache, message broker, and queue.
developer.redis.com
'Spring boot' 카테고리의 다른 글
Lombok (0) | 2023.07.12 |
---|---|
H2 Database (0) | 2023.07.11 |