Logo GH

기술 및 인프라 → Redis: 메모리 내 솔루션

Redis: 메모리 내 솔루션

1) Redis가 적절한 곳

Redis는 풍부한 데이터 구조를 갖춘 고속 인 메모리 키 값 스토리지입니다. 일반적인 시나리오:
  • 캐시 (읽기/제외, TTL, SWR) 및 세션.
  • 카운터 및 할당량: 요율 제한, 사기 방지, 캠페인 제한.
  • 리더 보드/등급 (ZSet), "상위 N" 권장 사항.
  • 이벤트 대기열/버스 (스트림/PubSub), 아웃 박스/받은 편지함, 배송.
  • Idempotence (TTL이있는 키), 디 덤업 웹 후크.
  • 지오 (가장 가까운 지점 검색), 비트 맵 (플래그, DAU).
  • 별칭/토큰 및 단기 승인 캐시.
💡 중요: 현금 잔고 및 중요 불변량의 경우 Redis는 DBMS/원장에 "진실의 원천" 이있는 읽기 가속기 또는 저널/캐시로만 사용됩니다.

2) 데이터 구조 및 적용 시점

문자열: 값/카운터 ('INCRŁ'), demempotent 키.
해시: 프로파일/구성 요소 집계, "경량" 객체 저장.
목록: 간단한 대기열 (그러나 재생/오프셋 의미론은 없음).
고유 한 요소, 중복 제거.
ZSet: 속도별로 정렬 (리드 보드, TTL 캘린더- "지연된" 이벤트).
스트림: 소비자 그룹, 'XREADGROUP '/재생-웹 후크, CDC, 배상을위한 안정적인 대기열.
지오: 'GEOADD/GEORADIUS' -가장 가까운 포인트/판매자.
Bitmap/Bitfield: 일련의 플래그 (일별 로그인, DAU/WAU).
HyperLogLog: 대략적인 Unique (UU) 는 메모리가 저렴합니다.
Bloom/Cuckoo (모듈): 빠른 가용성 검사, "MISS" 소스를 줄입니다.

모듈:
  • RedisJSON (JSON 문서), RediSearch (인덱싱/검색), RedisBloom (확률 구조), TimeSeries (메트릭/집계).

3) 키, TTL 및 메모리 정책

명명 및 세분화:

tenant:{t}:domain:{d}:{entity}:{id}:v{schema}    region={R}    currency={C}    lang={L}

Versioning ('vN') 에는 의미있는 차원 (지역/통화/언어/테넌트) 만 포함됩니다.
임차인 당 키 공간을 분리하십시오.

TTL 및 "신선도":
  • TTL 매트릭스 (sec/min/hr) 를 사용하고 각인을 피하기 위해 지터 (λ10-20%) 를 추가하십시오.
  • 핫 키의 경우-새로 고침 및 단일 비행 (하나의 리더 업데이트).
선점 정책 (최대 메모리 정책):
  • 'allkeys-lru/lfu' 는 TTL 종속성이없는 공유 캐시입니다.
  • '휘발성 -lru/lfu' -TTL이있는 키 만 있습니다.
  • 'noverse' -오버플로시 쓰기 실패 (중요한 대기열/카운터에 안전).
  • (PHP 3 = 3.0.6, PHP 4)

4) 거래, 파이프 라인 및 스크립트

파이프 라인: RTT, 그룹 10-100 팀을 줄입니다.
트랜잭션 (MULTI/EXEC) -읽기를 분리하지 말고 배치를 원자 적으로 실행하십시오.
최적의 잠금: 'WATCH key' → MULTI/EXEC → 확인.
Lua 스크립트: 서버 측의 원자 논리 (속도 제한, 잠금 장치, 복합 작업).

💡 Lua 스크립트는 단일 노드 Redis에 적합합니다. 클러스터에서-모든 키가 하나의 해시 슬롯 (해시 태그 '{...}') 에 속하는지 확인하십시오.

5) 대기열 및 버스: List vs Stream

목록 + 'BRPOP' -간단하지만 소비자 그룹, 오프셋/재생, 방울에 대한 약한 저항은 없습니다.
스트림: 'XADD → XREADGROUP → XACK', 재 시도-데드 레터 (N 분 안에 가져 가지 않음), 키로 분할. PSP/KYC 웹 후크, 지연된 지불/알림에 대해 권장됩니다.

우선 순위 대기열: 우선 순위별로 여러 스트림, 소비자는 처음부터 "빨리" 빠집니다.
연기 된 작업: ZSet 여기서 점수 = 타임 스탬프; 주기적인 'ZRANGEBYSCORE' λ는 이제 → 스트림으로 옮겨졌습니다.

6) 높은 가용성 및 확장 성

복제: 마스터 → 복제본 (읽기 규모).
센티넬: 자동 장애 마스터, 발견, 클라이언트 URI.
Redis 클러스터: 16384 슬롯 샤딩, 수평 스케일 아웃. '{순서: 123}' 해시 태그로 여러 구조를 사용하는 랩 키.

패턴:
  • 캐시/세션-클러스터/복제본, '클라이언트 측 해싱' SDK 지원.
  • 대기열/스트림의 경우-크로스 슬롯 작업을 최소화합니다. 도메인 키로 파티션.

7) 지속성: RDB, AOF 및 백업

RDB (스냅 샷): 더 빠르고 경제적 인; 마지막 초/분의 손실 위험.
AOF (저널): 손실 감소; 'Everysec/항상' 모드. AOF 압축 및주기적인 재 포장.
하이브리드: RDB + AOF → 빠른 복구 + 중간 손실.

백업: 오브젝트 스토리지에 대한 스냅 샷 및 AOF 사본; 정기적으로 회복을 확인

중요한 대기열/dedempotency의 경우 AOF 'everysec' + 복제를 선택하십시오.

8) 안전 및 준수

λH/ACL: 응용 프로그램 당 역할, "위험한" 명령 금지 ('FLUSHALL', 'KEYS').
클라이언트-서버 및 노드 간 링크에 대한 TLS; 고정 출구 IP.
네트워크 세분화: 개인 서브 넷, SG/NACL; 필요한 서비스/네임 스페이스에서만 액세스하십시오.
비밀을 기록하지 마십시오. Redis의 PAN/PII - 토큰/파생 상품 만 해당.
주요 명령: 'KEYS' 를 피하십시오-' SCAN '을 사용하십시오.

9) 관찰 및 SLO

주요 지표:
  • 대기 시간 (P95/P99), '순간 _ ops _ sec', '연결된 _ clients'.
  • (PHP 3 = 3.0.6, PHP 4)
  • 메모리: 사용, 단편화 비율, RSS, 할당자 통계.
  • 복제 지연, AOF/RDB 주파수 및 크기, 포크 시간.
  • 스트림: PEL (보류중인 항목 목록), 배송 대기 시간, 재 시도 카운트.
SLO 예:
  • Redis P99 연산은 5-10ms입니다.
  • 퇴거는 시간당 1% (캐시 공간) 입니다.
  • 스트리밍 전달 P99

10) FinOps 및 자원 계획

메모리는 비싸다: $/GB 월간 RAM과 원산지/DB 저장 요청 측정.
값 압축> 1-2KB를 사용하십시오 (CPU 참조).
LFU는 볼륨이 적을수록 더 나은 타격을 줄 수 있습니다.
Redis가 아닌 이미지/큰 얼룩의 경우 CDN+ 객체 저장소를 사용하십시오.

11) iGaming/fintech 패턴

11. 1 요율 제한 (루아)

아이디어: 창 키 + TTL의 'INCRŁ'; Lua는 원자 적으로 한계를 점검하고 증가합니다.

lua
-- KEYS[1]=key ARGV[1]=limit ARGV[2]=ttlSec ARGV[3]=inc local cur = redis. call('INCRBY', KEYS[1], ARGV[3])
if cur == tonumber(ARGV[3]) then redis. call('EXPIRE', KEYS[1], ARGV[2]) end if cur > tonumber(ARGV[1]) then return {0, cur} else return {1, cur} end

11. 2 요청 demmpotence

키 'idemp: TTL 24h, 값-결과/상태를 갖는 {요청 _ id}'. 작업을 수행하기 전에 존재를 확인합니다.

11. 리더 보드 3 개

'ZINCRŁ리더 보드: 게임: {g} 점수 사용자: {u}' → 'ZREVRANGE... WITHSCORES '.
지역/테넌트 별 상위 N-개별 ZSet 또는 접두사.

11. 4 PSP 웹 후크 큐

'XADD psp: 웹 후크... '→ 소비자 그룹' XGROUP CREATE psp: webhooks g1 $ '.
PEL 스캔 ('XPENDING' → 'XCLAIM') 을 통한 "고정 된" 메시지 배열.

11. 5 지불 연기

ZSet 'payout: due' (score = epoch) → 작업자는 정기적으로 완성 된 아이템을 중복 제거하여 Stream 'payout: exect' 로 이전합니다.

11. 6 사기 방지 미터

'PFADD' (고유) + 'INCR' (강도) + 지리/ASN 태그의 조합; 수동 검증을위한 트리거.

12) 메모리 및 성능 작업

클라이언트 연결 풀; RTT 감소 (유지).
명령 팩에 파이프 라인을 선호하십시오.
큰 키 ('MEMORY USAGE', 'SCAN') 를보십시오. 물체를 나누는 것이 좋습니다.
필드가 적은 해시는 많은 개별 키보다 경제적입니다.
테스트로 이익을 확인하면 io 스레드 (읽기 무거움) 를 사용하십시오.
prod에서 빈번한 'FLUSHDB/ALL' 을 피하십시오. 안전한 삭제를 위해 접두사 및 'UNLINK' 를 통해 관리하십시오.

13) 다중 임차인 및 격리

개별 클러스터/인스턴스 또는 테넌트 당 논리적 DB (부하가 작은 경우).
키/메모리 할당량, 분할 ACL.
네임 스페이스별로 키 및 메트릭의 접두사.

14) 잠금 및 일관성

SET 키 발 NX PX = ttl-간단한 돌연변이.
Redlock: 신중하게 사용하십시오 분산 중요 거래의 경우 "진실의 원천" (DB/원장) 및 dem 등원 작업에 의존하는 것이 좋습니다.
"긴" 잠금 장치 대신 원자 작업 및 Lua를 선호합니다.

15) 반 패턴

대형 블롭/이미지 저장-RAM 및 네트워크의 과부하.
Redis에서만 재무 불변량 (대차 대조표).
'KEYS' 와 '세계를 스캔' 하십시오.
TTL/지터 없음-만료시 도그 파일.
중요한 대기열에 대한 '모두-' 정책 → 압력시 데이터 손실.
할당량과 우선 순위없이 대기열, 캐시 및 세션을 혼합합니다.
클러스터의 다른 슬롯 키에서 작동하는 Lua 스크립트.

16) 구현 점검표

1. 역할 정의: 캐시/세션, 대기열/스트림, 카운터/제한-인스턴스/클러스터에 게시합니다.

2. 작업에 대한 최대 메모리 정책을 선택하십시오. 제한을 설정하고 퇴거를 모니터링

3. 키 이름 지정, 회로 버전, TTL 행렬 + 지터; 최고 키를위한 단일 비행.
4. 대기열의 경우 - 스트림 (그룹, retrays, DLQ), 지연된 - ZSet + 전송.

5. HA: 복제 + Sentinel 또는 Redis Cluster; 클라이언트 장애를 확인하십

6. 지속성: 스크립트에 따른 RDB/AOF; 정기적 인 백업 및 복구 테스트.
7. 보안: ACL, TLS, 개인 네트워크, 위험한 명령 금지.
8. 관찰 가능성: 대기 시간, ops/sec, 메모리, 퇴거, 복제 지연, 스트림 PEL.
9. FinOps: 메모리 프로파일, 큰 키, 압축, LFU; 큰 얼룩은 Redis를 피하십시오.
10. 패턴 문서 (속도 제한, demotency, 리드 보드) 및로드 테스트.

결과

Redis는 캐시, 대기열, 카운터, 리드 보드, 지리 및 확률 구조와 같은 속도의 "다기능 스위스 나이프" 입니다. 그 강점은 올바른 데이터 구조 선택, TTL/장애 분야, 운영 원자 성, 잘 생각 된 HA/지속성 및 관찰 성에 있습니다. 밀리 초 및 높은 RPS가 중요한 경우 Redis를 사용하고 중요한 불변량 (돈, 회계) 을 "진리의 원천" 에 남겨 두십시오. 이러한 방식으로 플랫폼은 빠르고 신뢰할 수 있습니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

Telegram
@Gamble_GC
통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.