프로젝트/redis

Redis Pipeline, Transaction, Lua script 차이

Junuuu 2023. 11. 6. 00:01

Redis Transaction이란?

여러 가지 명령어들을 처리하는 하나의 단위로 multi로 트랜잭션을 시작하고 exec를 통해 명령어들을 수행시켜 결괏값을 반환받습니다.

기존 RDB의 트랜잭션과는 조금 다른 의미를 가지고 있습니다.

 

Redis pipeline이란?

명령어들을 모아서 한번에 서버로 전송시켜 네트워크 오버헤드를 줄이는 방안입니다.

 

 

Transaction과 Pipeline

두 방법 모두 서버에 명령을 한 번만 보내는데 차이에 대해 조금 불확실하게 느껴집니다.

transaction을 활용하면 모든 명령은 pipelining 되고 EXEC가 실행되면 모든 명령이 함께 실행되므로 항상 여러 명령의 원자성을 유지합니다.

 

transaction과 pipelining은 어떻게 다를까요?

 

Pipeline을 처리하는 동안에는 중간에 다른 명령을 실행할 수 있다.

redis의 명령어를 처리하는 부분은 single thread여서 각각의 명령어들을 항상 원자적입니다.

하지만 서로 다른 클라이언트에서 주어진 두 명령은 번갈아 가며 순차적으로 실행될 수 있습니다.

하지만 multi/exec 사이에 존재하는 명령어들은 다른 클라이언트가 명령을 실행하지 않도록 보장합니다.

중간에 다른 클라이언트의 명령이 실행되지 않기 때문에 너무 오래걸리는 트랜잭션을 사용하지 않도록 주의해야 합니다.

 

pipeline으로 처리하는 동안에는 다른 클라이언트의 작업을 처리할 수 있습니다.

즉, 클라이언트가 5개의 요청이 담긴 pipeline 2개를 보내면 각 pipeline의 명령은 순차적으로 실행되지만 2개의 pipeline이 번갈아가면서 수행될 수 있습니다.

 

https://rafaeleyng.github.io/redis-pipelining-transactions-and-lua-scripts

 

Transaction이 Pipeline보다 큰 개념일까?

transaction을 제공하는 라이브러리에서 pipelining이 적용되어 있다면 pipeline을 사용할 때 얻을 수 있는 모든 성능 이점들이 적용됩니다.

하지만 라이브러리가 pipelining이 적용되어 있지 않다면 모든 명령을 개별적으로 redis에 전달할 것이므로 성능 이점들이 적용되지 않습니다.

따라서 항상 transaction을 사용하면 pipeline이 포함되는 개념이라고 볼 수는 없을 것 같습니다.

 

LuaScript란?

LuaScript란 Lua 프로그래밍 언어로 작성된 사용자 지정 스크립트를 Redis 서버 내에서 직접 실행할 수 있는 기능입니다.

Atomic 한 작업으로 Redis 데이터에 대한 복잡한 작업을 수행할 수 있는 강력한 방법입니다.

 

Transaction, Pipeline 과는 다르게 중간 결과를 조작할 수 있습니다.

예를 들어 Transaction 내부에서는 데이터를 GET해오면 null이 반환됩니다.

 

중간 결과인 데이터를 통해 조건부로 명령을 실행할 수 있다는 장점이 있습니다.

 

 

 

 

참고자료

https://rafaeleyng.github.io/redis-pipelining-transactions-and-lua-scripts

https://stackoverflow.com/questions/29327544/pipelining-vs-transaction-in-redis

https://charsyam.wordpress.com/2013/12/31/redis-pipeline-and-transactionmultiexec/