한 번에 많은 데이터를 redis에 넣어야 하는 경우 단일 명령어를 여러 번 호출하게 되면
호출이 일어날때마다 RTT(round trip time)로 인한 네트워크 지연이 발생할 수도 있다.
이러한 상황에서는 redis에서 제공하는 기능 중에 lua script or pipeline을 이용하면
RTT(round trip time)로 인한 네트워크 지연을 완화할 수 있다.
Redis pipeline
redis의 명령어들을 일괄로 처리하여 RTT(rount-trip-time)를 최적화하는 방법
개별 명령에 대해 응답을 기다리지 않고 한 번에 여러 명령을 실행하여 성능을 개선
파이프라이닝을 활용하면 단순히 네트워크 지연시간을 줄일 뿐 아니라, Redis 서버에서 처리할 수 있는 작업의 수 향상
Redis 서버가 각 네트워크 요청에 대해 소켓 I/O를 수행할 때 read, write의 system call이 발생
-> context switch(사용자 영역에서 커널영역으로 이동) 속도 저하 초래
lua script
Redis 서버에서 실행되는 스크립트 언어로 작성된 프로그램
Lua script 내에서 Redis의 내장 명령어, 조건문, 루프, 변수 할당 등 다양하고 복잡한 작업을 수행할 수 있다
위에서 소개한 pipeline와 동일하게 명령어를 일괄 처리하여 RTT를 최적화한 방법이다.
추가로, Transaction(atomic)도 적용되어 Lua script 내에 모든 동작이 완료되지 전까지는 Redis에 들어온 다른 요청들은 blocking 된다.
다만, Lua script 내의 하나의 명령어가 실패하였더라도 모든 명령어가 롤백되지는 않는다
(하나가 실패하였더라도 다음 명령어 진행)
Redis cluster 환경에서의 고려
클러스터 환경에선 mget과 같은 다중 키 커맨드를 사용할 수 없다.
클러스터 모드에서 다중 키를 위해 해시 태그를 지원하는데 {}로 감싸진 값을 기반으로 해시값을 생성하도록 되어있다.
해시태그가 같다면 반드시 같은 슬롯에 포함되는 것이 보장된다.
mget이나 Pipelining, Lua script 모두 동일한 해시태그가 아니라면 커맨드를 사용할 수 없다.
그렇기에 클러스터 환경에서 다중키로 RTT를 줄이려는 경우 동일한 해시태그를 활용하여 키를 구성하고
동일 해시태그로 그룹화 하여 배치처리를 수행하도록 하는 고민이 반드시 필요