[타임딜 #05] Redis 재고 카운터 — DECR vs Lua
·
토이 프로젝트
이번 글 요약재고 100개가 다 팔린 뒤에도, "품절" 안내만 받으면 되는 주문까지 전부 DB를 거쳐 갔다. 품절 주문 하나마다 DB에서 SQL이 3개씩(UPDATE, SELECT, ROLLBACK) 실행됐고, 주문이 초당 3,000건 몰리자 품절 응답이 0.6초, 상관없는 상품 조회도 0.6초가 됐다.재고 숫자를 Redis에도 적어 두고 주문이 오면 거기서 먼저 줄이게 하자, 품절 주문은 DB에 한 번도 가지 않았다. 품절 응답은 0.6초에서 0.0015초(1.5ms)가 됐다.그런데 결제가 실패해도 Redis 숫자는 그대로라서, 다시 팔 수 있는 재고 19개가 테스트 3분 내내 안 팔렸다. 실패한 만큼 Redis 숫자도 되돌리고, "남은 수량 확인"과 "줄이기"를 Lua 스크립트 하나로 묶어 그 사이에..