💡Redis 묶음
- ✔️ Redis 란 (특징, 주의점, 동작 구조)
- Spring 에서 Redis 사용하기 (설정, In-memory DB, Transaction)
- Spring Boot 에서 Redis Cache 사용하기
[목차]
- Redis 란
- Redis 특징
- Redis 사용시 주의사항
- Redis 동작 구조
Redis 란 무엇일까
Redis - Remote dictionary server (외부 딕셔너리[key : value] 구조의 서버)
- Redis 는 Key, Value 의 구조를 가지는 비정형 데이터를 저장하고 관리하는 비 관계형 데이터베이스 관리 시스템(DBMS) 입니다.
- Redis 는 DataBase, Cache, Message Broker (Pub/Sub)으로 주로 사용됩니다.
- Redis 는 인 메모리 데이터 구조를 가진 저장소이기 때문에 하드디스크에 데이터를 저장하는 DBMS(Mysql 등등.) 보다 더 빠른 성능을 가집니다.
- Redis 는 인-메모리 데이터를 사용하기에 높은 데이터 휘발성을 가집니다. 따라서 서버 장애시 데이터 유실이 발생할 수 있기에 그에 대한 운영 플랜을 필요로 합니다.
특징
- Remote dictionary server
- Key : Value 의 구조
- Database, Cache, Message broker
- In-memory data Structure Store
- 메모리 상에 데이터를 저장하는 서버 (Main Memroy - DRAM)
- Database보다 "더 빠른 Memory"에 더 "자주 접근"하고 "덜 자주 바뀌는" 데이터를 저장하자
- Support rich data structure (참고)
- Strings (key : value)
- Lists
- Set
- Sorted Set
- Hash
- Bitmaps, Bitfields (이진 논리와 상태를 저장, 비트맵 키 간에 AND, OR, XOR, NOT 연산 제공)
- HyperLogLog
- Geospatial indexes
- Streams
- Single Threaded
- Redis 는 기본적으로 Single Thread 구조를 가집니다.
- Redis 자료구조는 Atomic Critical Section 에 대한 동기화를 제공하기 때문에 Thread Safety 합니다.
- 서로 다른 Transactinon 의 Read/Write 동기화
Redis 사용 시 주의해야 할 점
1. Redis 는 Single Thread 서버 이므로 시간 복잡도를 반드시 고려해야합니다.
- 작업 처리의 시간 복잡도가 O(N) 인 자료구조의 사용은 지양해야한다고 합니다.
- ex) KEYS, Flush, GetAll
2. In-memory 특성상 메모리 단편화, 가상 메모리등의 이해가 필요합니다.
- 메모리 단편화
- 메모리 단편화로인해 CPU에서는 실제 사용되는 Memory 총량보다 더 많은 메모리를 잡고있다고 생각할 수 있습니다.
따라서 Redis 를 사용할때는 보다 여유있게 메모리 공간을 설정해야합니다.
- 메모리 단편화로인해 CPU에서는 실제 사용되는 Memory 총량보다 더 많은 메모리를 잡고있다고 생각할 수 있습니다.
- Virtual Memory - Swap
- 가상 메모리를 사용한다면 하드 디스크에서 데이터를 가져올 때의 Context Swtiching 지연시간으로 인해 Single Thread 인 Redis 에 부담이 가해질 수 있습니다.
- Replication - Fork
- Redis 는 휘발성을 가지고 있는 메모리상에 데이터를 저장하기 때문에 Replication(데이터 복사) 기능을 제공합니다.
- 만약 메모리상의 데이터 저장공간이 가득 찼다면 Fork연산 중 Redis server 가 다운 될 수도 있습니다.
Redis 동작 구조
Redis 는 정말 싱글스레드일까?
✔️ 레디스는 Event Loop(이벤트루프)를 이용하여 요청을 수행합니다.
- 즉, 실제 명령에 대한 작업(Task)는 커널 I/O 레벨에서 Multiplexing(멀티플렉싱)을 통해 처리하여 동시성을 보장합니다.
- 따라서, 유저 레벨에서는 싱글스레드로 동작하지만, 커널 I/O 레벨에서는 스레드풀을 이용합니다.
→ 즉, 클라이언트로 부터 전송된 네트워크를 읽는 부분과 전송하는 부분은 Multi Thread로 구현되어있으며,
→ redis에 요청한 명령을 실행하는 부분은 Single thread로 구현되어 있어 작업의 원자성(Atomic) 보장합니다.
Redis 멀티스레드 동작 지원은 v6 이후에 릴리즈 되었다고 합니다.
참고
- reids data structure : https://redis.io/redis-enterprise/data-structures/
- redis가 싱글 스레드인 이유 : https://akasai.space/redis/about_redis_2/
- redis 정말 싱글스레드 일가 : https://velog.io/@hope1213/Redis-%EC%A0%95%EB%A7%90-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%BC%EA%B9%8C
- 🤔디디의 Redis : https://youtu.be/Gimv7hroM8A?si=80Ml6RRa3caec4-c