Redis 로 api lock 구현 / SETNX 사용

이건개발·2024년 7월 23일
0

그전엔 맴캐시를 썼으나 이젠 레디스 쓰게 되서 남겨둡니다.

한 사람이 웹을 여러번 할 때 순서대로 처리되어야할 경우가 있습니다.

예를 들어
아이템 2개 획득
아이템 1개 소모
아이템 1개 소모

이게 순서대로 요청되면 모두 성공하겠지만
통신 상태에 따라 첫번째 통신이 처음오 오지 않을 수도 있습니다.
모바일에서는 더욱 발생할 가능성이 높죠

그래서 통신에 번호를 붙이고
통신이 완료될때까지 lock 을 걸어야합니다.

통신 순서에 맞지 않는게 온다면 대기를 태울 수 있겠습니다.

그래서 사용하는 명령이
Redis - SETNX 입니다.
설명페이지: http://redisgate.kr/redis/command/setnx.php

이 명령어는 키가 없을때는 SET 이되고 1을 리턴합니다.
키가 이미 있을 경우 쓰지않고 0을 리턴합니다.

awit redis.del(유저ID);
var a = awit redis.setnx(유저ID, 1);
a // 1;
var b = awit redis.setnx(유저ID, 1);
b // 0;

api 시작할때 setnx 를 하고
추가로 타임아웃이 될 수 있으니 expire 30초
이런식으로 걸면 될것 같습니다.

api 끝날때 del 하면 될듯합니다.

그러면 동시에 유저 1명의 패킷이 처리될 일이 없겠죠
여기에 통신 번호를 넣어서 순서대로 오지 않았을 경우에 대한 처리도 하면 될것 같습니다.

profile
게임 개발 / 웹 개발 / 주식 투자 / 은퇴자 / 클라우드타입 / 파이어베이스 / 수퍼베이스 / 유니티

1개의 댓글

comment-user-thumbnail
2024년 7월 24일

잘배워갑니다.

답글 달기