피드로 돌아가기
Dev.toBackend
원문 읽기
Redis의 INCR 명령이 단일 스레드 기반 원자성으로 분산 시스템에서 race condition을 제거하여 경합 문제 없이 카운터·레이트 리미팅·ID 생성 구현
Redis INCR: O comando atômico que você deveria conhecer
AI 요약
Context
분산 시스템에서 여러 프로세스가 동시에 같은 값을 읽고 수정할 때 race condition이 발생하여 데이터 불일치가 생긴다. 예를 들어 두 프로세스가 동시에 값 10을 읽고 각각 1을 더해 11을 쓰면, 예상값 12가 아닌 11이 저장되는 문제가 발생한다.
Technical Solution
- Redis INCR 명령 도입: 값 읽기-증가-쓰기를 단일 원자 연산으로 실행하여 중간 상태 접근 불가능
- 단일 스레드 기반 순차 실행: Redis는 모든 명령을 하나의 스레드에서 순차 처리하므로 명령 간 내부 경합이 발생하지 않음
- TTL(Time To Live) 설정: INCR 후 EXPIRE를 사용해 카운터에 자동 만료 시간을 지정 (첫 증가 시에만 TTL 설정)
- INCRBY, INCRBYFLOAT, DECR, DECRBY 등 확장 명령 활용: 1이 아닌 임의 정수 또는 실수값으로 증가/감소
- ASP.NET Core 미들웨어에 통합: HTTP 요청 클라이언트별로 레이트 리미팅 적용하고 응답 헤더에 제한 정보 포함
Key Takeaway
Redis의 단순한 원자 연산이 복잡한 분산 동시성 문제를 해결하며, 복잡한 알고리즘보다 작은 원자 작업을 올바르게 결합하는 것이 분산 시스템 설계의 핵심이다.
실천 포인트
분산 애플리케이션에서 조회 카운터·API 레이트 리미팅·시퀀셜 ID 생성이 필요할 때 Redis INCR을 사용하면, GET 후 SET 패턴의 race condition 없이 원자적으로 카운터를 관리할 수 있다. 다만 INCR 후 EXPIRE 사이의 경합 문제를 피하려면 Lua 스크립트로 두 연산을 감싸거나 RedisOK 명령 조합을 사용해야 한다.