1. Redis란?
- Redis는 Memcached와 비슷한 캐시 시스템으로 동일한 긴응르 제공하면서 영속성, 다양한 데이터 구조와 같은 부가적인 기능을 제공한다.
- Redis는 Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 비관계형 데이터 베이스 관리 시스템(DBMS)이며 데이터베이스, 캐시, 메시지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소이다.
- Redis는 메모리에 저장하고 데이터를 읽어와서 빠른 DB라고 생각하지만, 빠른 성능은 레디스의 특징 중 일부분이다. 다른 인메모리 디비들과 가장 큰 차이점은 레디스의 다양한 자료구조이다.
- Strings, Bitmaps, Bit field, Hashes, Lists, Sets, Sorted Sets, Geospatial Indexes, Hyperloglogs, Streams 등의 다양한 자료구조가 있다.
- 이렇게 다양한 자료구조를 지원하여 개발의 편의성이 좋아진다.
- 특히 어떤 데이터를 정렬할 때 기존 DBMS를 이용하면 DB에 데이터를 저장하고 저장된 데이터를 다시 정렬해서 다시 읽어오는 과정을 디스크에 직접 접근해야하기 때문에 시간이 많이 걸리는 단점이 있지만 In-Memory 데이터베이스인 Redis를 이용하면 레디스에 제공하는 Sorted-Set이라는 자료구조를 통해 더 빠르고 간단한 데이터 정렬이 가능해진다.
2. Redis를 통해 구현한 캐시 서버
- 데이터베이스가 기존에 존재하는데도 Redis라는 인메모리 데이터 구조 저장소를 사용하는 이뉴는 데이터베이스는 물리 디스크에 직접 쓰기 떄문에 서버에 문제가 발생하여 다운되어도 데이터가 손실되지 않는다. 그러나 매번 디스크에 접근해야하기 때문에 사용자가 많아질수록 부하가 증가하고 느려질 수 있는 문제점이 있다.
- 그래서 사용자가 늘어난다면 데이터 베이스가 과부하가 발생할 수 있기 때문에 캐시 서버를 도입하게 되며, 이때 사용하는 캐시 서버에 Redis를 활용한다.
- 캐시는 한번 읽어온 데이터를 임의의 공간에 저장해 다음에 읽어올 때 빠른 결괏값을 받을 수 있도록 도와주며 같은 요청이 여러 번 들어올 때 매번 데이터 베이스를 거치는 것이 아니라 캐시 서버에 첫번쨰 요청 이후 저장된 결괏값을 바로 보내주기 때문에 DB의 부하를 줄이고 서비스의 속도노 느려지지 않을 수 있다.
- 캐시 서버는 Look aside cache 패턴과 Write Back 패턴이 존재한다.
1) Look aside cache
- 클라이언트가 데이터를 요청하면 웹서버는 데이터가 존재하는지 Cache 서버에서 먼저 확인한다.
- Cache 서버에 데이터가 있으면 DB에서 데이터를 조회하지 않고 Cache 서버에 있는 결과값을 클라이언트에게로 바로 반환하며 Cache 서버에 데이터가 없으면 DB에 데이터를 조회하여 Cache 서버에 저장하고 결과값을 클라이언트에게 다시 반환하도록 한다.
2) Write Back
- 웹서버는 모든 데이터를 Cache 서버에 저장하고 cahe 서버에 특정 시간 동안 데이터가 저장된다.
- cache 서버에 있는 데이터를 DB에 저장하고 DB에 저장된 cache 서버의 데이터를 삭제한다.
- 이러한 원리는 insert 쿼리를 한 번씩 500번 날리는 것 보다 insert 쿼리를 500개 붙여서 한번에 날리는 것이 더 효율적이라는 원리이며, 이 방식은 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무는데에 이때 서버에 장애가 발생해서 다운되면 데이터가 손실 될 수 있는 단점이 있다.
3. Redis의 특징
- Key, Value 구조인 NOSQL로 쿼리를 사용할 필요가 없다.
- 다양한 자료 구조를 지원한다.
- String : 가장 일반적인 Key - value 구조의 형태이다.
- Sets : String의 집합으로 여러 개의 값을 하나의 value에 넣을 수 있다. 포스팅의 태깅 같은 곳에서 사용 가능하다.
- Sorted Sets : 중복된 데이터를 담지 않는 Set 자료구조에 정렬 Sort를 적용한 구조로 랭킹 보드 서버와 같은 구현에 사용될 수 있다.
- Lists : Array 형식의 데이터 구조로 사용할 떄 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입하거나 삭제하는 것은 어려운 특징이 있다.
- Single Threaded 구조이다.
- 한번에 하나의 명령만을 처리하며 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요하다.
- 그러나 get, set의 명령어의 경우 초당 10만개 이상의 처리를 할 수 있을 만큼 매우 빠르다.
*** Redis 빠르게 시작해보기
1. (http://redisgate.kr/redis/education/docker_intro.php) 참조하면 docker로 빠르게 redis 서버를 구현하여서 서버 내에서 사용 가능한다.
레디스 서버 실행하기
docker run --name myredis -d -p 6379:6379 redis
Docker의 redis-cli로 접속하기
docker run -it --link myredis:redis --rm redis redis-cli -h redis -p 6379
2. Spring Boot에서 Redis 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
'CS > 데이터베이스' 카테고리의 다른 글
Transaction에 대하여 (0) | 2022.07.24 |
---|