You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SADD myset apple
SADD myset banana
SCARD myset
SMEMBERS myset
SISMEMBER myset apple
SISMEMBER myset grape
Hashes
하나의 key 하위에 여러개의 field-value 쌍을 저장
여러 필드를 가진 객체를 저장하는 것으로 생각할 수 있음
HINCRBY 명령어를 사용해 카운터로 활용 가능
명령어
기능
예제
HSET
한개 또는 다수의 필드에 값을 저장한다.
HSET user name bear age 10
HGET
특정 필드의 값을 반환한다.
HGET user1 name
HMGET
한개 이상의 필드 값을 반환한다.
HMGET user1 name age
HINCRBY
특정 필드 값을 Integer로 취급하여 저장한 숫자를 증가 시킨다.
HINCRBY user1 viewcount 1
HDEL
한개 이상의 필드를 삭제한다.
HDEL user1 name age
접기/펼치기
HSET user name bear age 10
HGET user name
HMGET user name age
HSET user viewcount 15
HGET user viewcount
HINCRBY user viewcount 3
HKEYS user
HDEL user name age
HKEYS user
SortedSets
Set과 유사하게 유니크한 값의 집합
각 값은 연관된 score를 가지고 정렬되어 있음
정렬된 상태이기에 빠르게 최소/최대값을 구할 수 있음
순위 계산, 리더보드 구현 등에 활용
명령어
기능 제
예제
ZADD
한개 또는 다수의 값을 추가 또는 업데이트 한다.
ZADD myrank 10 apple 20 banana
ZRANGE
특정 범위의 값을 반환한다.(오름차순으로 정렬된 기준)
ZRANGE myrank 0 1
ZRANK
특정 값의 위치(순위)를 반환한다.(오름차순으로 정렬된)
ZRANK myrank apple
ZREVRANK
특정 값의 위치(순위)를 반환한다.(내림차순으로 정렬된)
ZREVRANK myrank apple
ZREM
한개 이상의 값을 삭제한다.
ZREM myrank apple
접기/펼치기
ZADD myrank 10 apple 20 banana 30 grape
ZRANGE myrank 0 1
ZREVRANK myrank apple
ZRANK myrank apple
게임 리더 보드 만들기
리더보드의 특성과 기능 요구사항
게임이나 경쟁에서 상위 참가자의 랭킹과 점수를 보여주는 기능
순위로 나타낼 수 있는 다양한 대상에 응용
리더보드의 동작 API
점수 생성/업데이트 -> SetScore(userid, score)
상위 랭킹 조회 -> getRange(1~10)
특정 대상 순위 조회 -> getrank(userId)
RDBMS 사용시 문제
한 행에만 접근하므로 비교적 빠름
랭킹 범위나 특정 대상의 순위 조회
데이터 정렬하거나 count등의 집계 함수연산을 수행하므로 데이터가 많아질수록 속도가 느려짐
Redis 사용시 장점
순위 데이터에 적합한 sorted-set 자료구조를 사용하면 socre를 통해 자동을 정렬됨
용도에 특회된 오퍼레이션이 존재하므로 사용이 간단함
자료구조의 특성으로 데이터 조회가 빠름
빈번한 액세스에 유리한 In-memory DB의 속도
Pub/Sub을 이용해 손쉽게 채팅방 기능 구현하기
Pub/Sub 패턴
메시징 모델 중 하나로 발행과 구독 역할로 개념화 한 형태
발생자와 구독자는 서로에 대한 정보 없이 특정 토픽 or 채널을 매개로 송수신
메시지미들웨어 사용의 장점
비동기: 통신의 비동기 처리
낮은 결합도: 송신자와 수신자 직접 서로 의존하지 않고 공통 미들웨어에 의존
탄력성: 구성원들간에 느슨한 연결로 인해 일부 장애가 생겨도 영향이 최소화됨
Redis의 Pub/Sub 특징
메시지가 큐에 저장되지 않음
Kafka의 컨슈머의 그룹같은 분산처리 개념이 없음
메시지 발행 시 push 방식으로 subscriber들에게 전송
subscriber가 늘어날수록 성능저하
Redis의 Pub/Sub의 유즈케이스
실시간으로 빠르게 전송되야 하는 메시지
메시지 유실을 감내할 수 있는 케이스
최대 1회 전송 패턴이 적합한 경우
Subscriber들이 다양한 채널을 유동적으로 바꾸면서 한시적으로 구독하는 경우
Redis의 백업과 장애 복구
RDB를 사용한 백업
RDB = Redis Database를 사용한 백업
특정 시점의 스냅샷으로 데[이터를 저장
재시작 시 RDB 파일이 있으면 읽어서 복구
dump.rdb
RDB 사용의 장단점
장점
작은 파일 사이즈로 백업 관리가 용이
fork를 이용해 백업하므로 서비스 중인 프로세스는 성능에 영향 없음
데이터 스냅샷 방식으로 빠른 복구 가능
단점
스냅샷을 저장하는 시점 사이의 데이터 변경사항을 유실될 수 있음
fork를 이용하기 떄문에 오래 걸릴 수 있고, cpu와 메모리 자원을 많이 소모
데이터 무결성이나 정합성에 대한 요구가 크지 않은 경우 사용 가능(마지막 백업 시 에러 발생 등의 문제)
Network bandwidth & latency: Redis의 throughput은 주로 network에 의해 결정되는 경우가 많음. 운영 환경에 런치하기 전에 배포 환경의 network 대역폭과 실제 throughput을 체크하는 것이 좋음.
CPU: 싱글 스레드로 동작하는 Redis 특성 상 CPU 성능이 중요. 코어 수보다는 큰 cache를 가진 빠른 CPU가 선호됨.
RAM 속도 & 대역폭: 10KB 이하 데이터 항목들에 대해서는 큰 영향이 없음.
가상화 환경의 영향: VM에서 실행되는 경우 개별적인 영향이 있을 수 있음(non-local disk, 오래된 hypervisor의 느린 fork 구현 등)
성능에 영향을 미치는 Redis 설정
rdbcompression <yes/no>: RDB 파일을 압축할지 여부로, CPU를 절약하고 싶은 경우 no 선택
rdbchecksum <yes/no>: 사용시 RDB의 안정성을 높일 수 있으나 파일 저장/로드 시에 10% 정도의 성능 저하 있음
save: RDB 파일 생성시 시스템 자원이 소모되므로 성능에 영향이 있음
SLOWLOG 설정
수행시간이 설정한 기준 시간 이상인 쿼리의 로그를 보여줌
측정 기준인 수행시간은 I/O 동작을 제외함
# 로깅되는 기준 시간(microseconds)
slowlog-log-slower-than 10000
# 로그최대길이
slowlog-max-len 128
MSA와 Event-Driven 아키텍처
Redis Stream 이해
append-only log를 구현하는 자료 구조
하나의 key로 식별되는 하나의 stream에 엔티티가 계속 추가되는 구조
하나의 엔트리는 entity id + (key-value 리스트로) 구성
추가된 데이터는 사용자가 삭제하지 않는 한 지워지지 않음
Redis Streams의 활용
센서 모니터링(지속적으로 변하는 데이터 시간 별 날씨 수집 등)
유저별 알림 데이터 저장
이벤트 저장소
Redis Streams의 명령어: 엔트리 추가
XADD: 특정 key의 stream에 엔트리를 추가한다.
XADD [key] [id] [field-value]
# user-notifications라는 stream에 1개의 엔트리를 추가하여 2개의 field-value 쌍을 넣음
XADD user-notifications * user-a hi user-b hello
Redis Streams의 명령어: 엔트리 읽기(범위 기반)
# XRANGE: 특정 ID 범위의 엔트리를 변환한다.
XRANGE [key] [start] [end]
# user-notifications의 모든 범위를 조회
XRANGE user-notifications - +
Redis Streams의 명령어: 엔트리 읽기(offset 기반) - 1
# XREAD: 한 개 이상의 key에 대해 특정 ID 이후의 엔트리를 반환한다.(동기 수행 가능)
XREAD BLOCK [milliseconds] STREAMS [key] [id]
# user-notifications의 모든 범위를 조회
XREAD BLOCK 0 STREAMS user-notifications 0
Redis Streams의 명령어: 엔트리 읽기(offset 기반) - 2
# user-notifications에서 새로 들어오는 엔트리를 동기 방식으로 조회
# 앞으로 들어올 데이터 동기 방식으로 조회하여 event listener와 같은 방식으류 사용 가능
XREAD BLOCK 0 STREAMS user-notifications $
Redis Streams의 명령어: Consumer Group
한 stream을 여러 consumer가 분산 처리할 수 있는 방식
하나의 그룹에 속한 consumer가 서로 다른 엔트리들을 조회하게 됨
Redis Streams의 명령어: Consumer Group - 1
# XGROUP CREATE: Consumer group을 생성
XGROUP CREATE [key] [group name] [id]
# user-notifications에 group1 이라는 consumer group 생성
XGROUP CREATE user-notifications group1 $
Redis Streams의 명령어: Consumer Group - 2
# XREADGROUP: 특정 key의 stream을 조회하되, 특정 consumer group에 속한 consumer로 읽음
XREADGROUP GROUP [group name] [consumer name] COUNT [count] STREAMS [key] [id]
# user-notifications에서 group1 그룹으로 2개의 컨슈머가 각각 1개씩 조회
XREADGROUP GROUP group1 consumer2 COUNT 1 STREAMS user-notifications
특수 명령어
Pipeline
Pipelining 다수의 command를 한 번에 요청하여 네트워크 성능을 향상 시키는 기술 Round-Trip Times 최소화, 대부분 클라이언트 라이브러리에서 지원한다.
Round-Trip Times은 Request / Response 모델에서 발생하는 네트워크 지연 시간을 의미
트랜잭션
Transcation 다수의 명령을 하나의 트랜잭션으로 처리, 원자성을 보장, 중간에 에러가 발생하는 모든 Rollback 처리, 하나의 트랜잭션이 처리되는 동안 다른 클라이언트의 요청이 중간에 끼어들 수 없음
명령어
MULTI -- transcation begin
INCR foo
DISCARD -- rollback
EXEC