Backend/Redis (8) 썸네일형 리스트형 Redis Stream을 메시지 브로커로 사용하기 0. 개요이 글은 프로젝트를 진행하며 메시지 브로커로 Redis Stream을 활용한 경험을 작성한 글이다. 메인 서버(가챠 서버)에서 사용자가 특정 등급의 아이템을 모두 획득한 경우, 로또를 발급해준다. 이때 로또 발급 로직을 별도의 프로세스로 진행하고자 로또 서버를 생성했다. 그리고 메시지 브로커로 두 서버 간 통신을 이뤄 비동기 통신을 구현하고자 했다. Kafka, RabbitMQ 등의 메시지 브로커가 있는데, 기존에 Redis를 사용 중이었기 때문에 Redis를 활용했다. Redis의 pub/sub과 stream을 메시지 브로커로 사용할 수 있다.1. Redis Stream일반적으로 레디스를 이용해 메시지를 발행할 때는 pub/sub을 많이 사용한다. 하지만 이 방식은 메시지를 발행했을 때 수신자.. 레디스에서 다중 명령에 대한 원자성을 보장하는 방법 레디스는 싱글 스레드로 동작하므로 동시성 제어를 위한 복잡한 설계와 오버헤드가 적다. 그러나 싱글 스레드는 parallel 할 수 없는 것이지 concurrent 할 수 있다. 즉, 여러 레디스 클라이언트가 있고, 각 클라이언트가 여러 개의 명령을 한 번에 보낸다면, 레디스의 싱글 스레드는 여러 클라이언트들의 명령을 번갈아 하나씩 실행하게 되며 동시성 문제가 발생할 수 있다. 이를 방지하기 위해 크게 Redis Transaction과 Lua Script 2가지를 사용할 수 있다.Redis Transaction트랜잭션은 주로 관계형 데이터베이스에서 많이 쓰이는 용어인데, 레디스에서도 트랜잭션을 사용할 수 있다. 레디스에서 트랜잭션을 사용하면 여러 개의 커맨드에 대해 원자성이 보장된다. 따라서 concurr.. 센티널 로컬과 도커에 적용해보기 로컬에 적용이전 글에서 레디스의 복제와 센티널에 대해 알아봤다. 이번 글에서는 이들을 로컬 환경과 도커 환경에서 직접 적용해보자. 우선 로컬에 적용해보자. 레디스 서버는 다음과 같다.마스터: 6379 포트슬레이브: 6380 포트그리고 레디스 센티널 서버는 다음과 같다.센티널 서버 1: 26379 포트센티널 서버 2: 26380 포트센티널 서버 3: 26381 포트레디스 서버 띄우기(복제 환경)우선 복제 환경을 구성하기 위해 레디스 마스터와 슬레이브 서버를 띄워보자. /etc/redis 경로에 다음 두 개의 파일을 만들어뒀다. sudo nano /etc/redis/master.confsudo nano /etc/redis/slave.confmaster.confport 6379masterauth 1234re.. 레디스 복제(Replication)와 센티널(Sentinel) 고가용성가용성이란 일정 기간 동안 서비스를 정상적으로 사용할 수 있는 시간의 비율을 뜻하며, 이 값이 클수록 가용성이 높다고 한다. 서비스를 안정적으로 운영하기 위해서는 가용성을 높일 수 있는 방안을 도입해야 한다. 레디스는 고가용성을 확보하기 위해 다음 두 가지 기능을 제공한다.복제: 마스터 노드의 데이터를 복제본 노드로 실시간 복사하는 기능이다. 따라서 마스터 노드의 서버에 장애가 생겨 데이터가 유실된다고 해도 복제본 노드에서 데이터를 확인할 수 있다.자동 페일오버: 마스터 노드에서 발생한 장애를 감지해 레디스로 들어오는 클라이언트 연결을 자동으로 복제본 노드로 리다이렉션하는 기능이다. 따라서 마스터 노드의 서버에 장애가 발생했을 때 빠른 조치가 가능하다.복제(Replication)복제를 하는 이유.. 프로젝트에서 레디스를 사용하며 한 고민들 RDB 레디스는 인메모리 기반의 데이터베이스이다. 따라서 서버가 꺼지면 데이터는 모두 휘발된다. 만약 레디스의 데이터를 영구 저장하고 싶으면 레디스가 제공하는 AOF와 RDB 기능을 사용하면 된다. 두 기능에 대한 설명은 https://olsohee.tistory.com/115 이 글에 나와있다. 간략히 두 방식을 비교하면 데이터 손실이 없어야 하면 AOF를, 어느정도의 데이터 손실이 발생해도 괜찮으면 RDB를 사용하면 될 것 같다. 나의 경우, 레디스에 있는 인기글과 사용자 정보를 백업해야 하는 상황인데, 이는 어느정도의 데이터 손실이 발생해도 괜찮기 때문에 그 대신 적은 데이터 크기와 빠른 복구의 이점을 얻을 수 있는 RDB를 사용했다. RDB를 사용하면 일정 시간마다 스냅샷을 찍어 데이터 백업이 진.. 스프링부트에서 Redis 사용하기 Redis와 직렬화/역직렬화 레디스의 데이터 저장 형식은 byte array 형태이며, 사용하는 쪽에서 포맷을 지정하여 저장 및 조회할 수 있다. Spring Data Redis는 자주 쓰는 포맷을 편리하게 사용할 수 있도록 미리 Serializer 클래스를 정의해뒀다. 대표적인 Serializer 클래스를 살펴보자. JdkSerializationRedisSerializer 디폴트 Serializer이며 다른 Serializer를 지정하지 않으면 기본으로 사용된다. JdkSerializationRedisSerializer가 사용되면 레디스에는 바이너리 형태로 데이터가 저장된다. StringRedisSerializer redisTemplate.setKeySerializer(new StringRedisSer.. Redis 알아보기 Redis 캐시로 사용하기캐시란 데이터의 원래 소스보다 더 빠르고 효율적으로 액세스할 수 있는 임시 데이터 저장소이다. 이때 자주 액세스되고, 자주 변하지 않는 데이터가 캐시로 적합한 데이터이다. 레디스는 캐시로 적합한데 그 이유는 다음과 같다.레디스는 인메모리 기반의 데이터 저장소로, 처리 속도가 빠르다. 따라서 단순한 Get/Set 명령어의 경우 초당 10만 TPS를 갖는다(1초당 10만개의 명령 처리 가능). (*인메모리: 데이터를 메인 메모리(=랜덤 액세스 메모리(RAM))에 저장하여 처리하는 방식)레디스는 다양한 자료구조를 지원한다. 따라서 적절한 자료구조를 사용하여 데이터를 용이하게 관리할 수 있다.캐싱 전략읽기 전략 - Look Aside데이터를 찾을 때 우선 캐시를 조회한다(Cache Hi.. Redis에 토큰 저장하기 Redis Redis는 디스크가 아닌 메모리에 데이터를 저장하는 인메모리 방식의 데이터베이스이다. * 메모리(RAM, Random Access Memory): 빠른 액세스를 위해 데이터를 임시로 저장하는 저장소이다. 메모리에 올라간 데이터는 컴퓨터 전원이 꺼지면 휘발된다. * 디스크(HDD, SSD): 데이터를 영구적으로 저장하는 저장소이다. 디스크에 저장되어 있는 데이터는 CPU가 처리하는 속도가 메모리보다 느리다. 그러나 저장할 수 있는 용량이 메모리보다 훨씬 크고, 전원이 꺼지더라도 저장된 데이터가 휘발되지 않는다. * 인메모리 데이터베이스: 디스크가 아닌 메모리에 데이터를 저장하는 데이터베이스이다. IMDB(In-Memory Database) 또는 MMDB(Main Memory DBMS)라고 한다.. 이전 1 다음