Pipelining
redis pipelining
레디스의 여러 명령어를 한번에 수행할 수 있도록 해주는 기능
- Round-Trip Time(RTT)를 최소화
from redis import Redis
from time import time
c = Redis()
def non_pipeline():
before = time()
for key in range(100000):
c.set(key, 1, ex=10)
print('Not use pipelining = {}'.format(time() - before))
def use_pipeline():
before = time()
pipe = c.pipeline()
for key in range(100000):
pipe.set(key, 1, ex=10)
pipe.execute()
print('Use pipelining = {}'.format(time() - before))
non_pipeline()
# Not use pipelining = 27.983525037765503
use_pipeline()
# Use pipelining = 3.3340370655059814
💡 client가 pipe을 사용해 명령어를 보내는 중에는 서버가 응답을 queue에 쌓아두고 있는다. 따라서 너무 많은 명령어를 한번에 보내게 되면 서버 메모리가 고갈될 수 있으므로 많은 명령어를 한번에 보낼 때에는 batch 단위로 보내는 것이 좋다.
또한 pipelining은 단순히 RTT 뿐만 아니라 실제 redis server 내의 동작에서도 성능이 향상된다.
- 단일 요청에 대해서는 각 요청 당 read(), write() system call이 호출된다.
- 하지만 pipelining의 경우 전체 commands를 한번의 read() system call을 통해 읽고, 결과를 한번의 write()을 통해서 쓴다.

→ system call의 경우 kernel 영역에서 실행되기 때문에 OS단에서 context switching이 발생하게 되고, 이는 속도 측면에서 좋지 않다.
- 실제 pipelining을 적용했을 때의 수행시간으로, 초기에는 선형적으로 증가하지만 이후에는 점점 속도 증가가 느려지는 것을 볼 수 있다.
Pipelining vs Scripting
redis scripting : server에서 실행할 수 있는 lua script를 직접 전달하는 방식
- Redis scripting은 redis pipelining을 사용하는 많은 경우에서 더 효과적으로 대체할 수 있다.
redis scripting의 경우 data read/write을 pipelining보다 더 효과적으로 처리할 수 있다.
- pipelining의 경우 여러 명령어를 전달하고 그 결괏값을 반드시 받아서 다시 요청을 하는 방식으로 처리하는 반면,
- scripting의 경우 script 내부에서 연산을 모두 처리할 수 있으므로 결괏값을 서버에서 계속 사용할 수 있다.
# redis pipelining
client server
--commands-->
<--returns--
--commands-->
<--returns--
...
# redis scripting
client server
--commands-->
(process return's value in server)
<--returns--'Redis(레디스)' 카테고리의 다른 글
| Redis Sentinel (1) | 2023.12.10 |
|---|---|
| Redis client-side caching (1) | 2023.12.10 |
| Redis pub/sub & redis stream과의 차이점 (1) | 2023.12.10 |
| Redis Transaction (1) | 2023.12.10 |
| Redis 데이터 타입 정리 (1) | 2023.12.10 |