우리 서비스는 실시간으로 수많은 사람들의 좌석 선점 요청을 받고 적용해야 한다.
이 때, Redis 내의 좌석 현황을 수정하는 도중에 추가적인 참조 혹은 수정이 일어나는 동시성 문제를 예방해야 했다.
좌석 현황은 각 이벤트 별로 한 덩어리가 되어 Redis에 저장된다.
예를 들어 한 공연장에 좌석의 개수가 1만 개라면 1만 길이의 배열이 저장된다.
이 때 유저의 좌석 선점/해제 요청은 한 번에 하나씩 받게 된다.
배열의 중간 요소 하나를 수정하기 위해서, 1만 길이의 데이터를 Redis로부터 가져오고, 다시 그 큰 데이터를 Redis 안에 덮어 씌우게 된다.
심지어 그 동안에 다른 스레드는 좌석 현황 데이터에 접근하지 못하게 해야 하는 상황이다. 이는 큰 오버헤드라고 생각했다.
Lua 스크립트란 경량 프로그래밍 언어로, Redis에서는 복잡한 데이터 조작을 위해 내장되어 있다.
Lua 스크립트를 사용해 Redis를 조작하면 다음과 같은 특성을 얻을 수 있다.
이 특성들로 인해 Lua 스크립트로 정의된 하나의 명령은 원자성을 보장받고, 자동으로 동시성 제어를 이뤄낼 수 있다.