파이프라인은 이전 요청의 응답을 기다리지 않고 새로운 요청을 보낼 수 있는 기능입니다. 여러 명령어를 동시에 송신하여 네트워크 RTT를 절약할 수 있습니다.
GET/SET
을 N개 처리보다는 MGET/MSET
으로 한번에 처리하는 것이 좋습니다.
파이프라인 내에서는 명령의 순서가 보장되기 떄문에 여러 명령어를 빠르게 전송하고 응답은 나중에 한꺼번에 처리하는 것이 효과적입니다.
redis-cli나 다른레디스 라이브러리는 대량의 데이터를 삽입하기 위한 기능을 지원합니다.
--pipe
옵션을 사용해 실행하면 성공한 명령어의 개수는 replies
오류가 발생한 명령어의 개수는 errors
로 표시됩니다.
레디스는 내장 스크립트 언어로 루아를 채택하고 있습니다. 레디스의 명령어만으로는 구현하기 어려운 유연한 처리와 기능 확장 등을 루아를 통해 빠른 속도로 구현할 수 있습니다.
단순히 명령어를 조합하는 것 이상의 복잡한 작업을 하려고 할 때, app에서 한꺼번에 처리 작업을 진행할 수도 있습니다. 하지만 이 경우, 앞에서 언급한 것처럼 지연 시간이나 실행 속도 문제가 따라옵니다.
루아를 사용하면 파이프라인과 달리 레디스에서 모든 작업을 원자적으로 처리할 수 있습니다. 파이프 라인은 편리하지만 한편으로 다음과 같은 문제가 있습니다.
만약 위와 같은 상황이라면 루아는 다음과 같은 특징이 있으므로 좋은 선택지가 될 수 있습니다.
레디스는 오랫동안 이페머럴 스크립트로 루아를 실행할 수 있었지만, 레디스 7.0 이후에는 레디스 함수로 루아를 실행할 수 있게 되었습니다.
MULTI/EXEC
명령어 실행 중에는 다른 클라이언트의 간섭 없이 원자적 처리를 할 수 있습니다. 트랜잭션은 MULTI
명령어 뒤에 선언된 명령어를 큐에 넣어 처리합니다.
트랜잭션을 실행할 때는 다음과 같은 이유로 실패하는 경우도 있습니다.
첫 번째 경우 처름 큐에 넣을 때 오류가 발생하면, 트랜잭션 실행을 거부하고 파기하는 방식으로 동작합니다.
두 번쨰 경우 큐에 들어간 명령어는 모두 실행되면 부분 오류는 실패가 됩니다.
레디스 트랜잭션은 RDBMS에서 제공하는 롤백 기능을 지원하지 않고, 명령어 실패 시 그대로 남은 작업을 계속 처리합니다.
모듈 기능은 레디스 소스코드를 수정하지 않고도 C 언어로 구현하여 레디스 서버에 독립적으로 추가할 수 있습니다. 호환성을 위해 레디스는 모듈만을 위한 API를 만들어 이를 통해 레디스와 연동할 수 있습니다.
레디스 서버에 저장된 데이터 세트를 변경하거나 레디스 서버에 어떤 이벤트가 발생하면 알림을 제공하는 시스템
특정 키의 삭제 혹은 만료, 특정 자료형 명령어가 실행 등의 경우에 다른 처리를 수행하도록 트리거를 설정할 수 있습니다.
Pub/Sub
기능을 사용하여 수신하는 시스템으로, 클라이언트 측에서 해당 기능의 명령어를 사용해야 합니다.
레디스 서버 내 데이터를 가져오기 위해 클라이언트가 레디스 서버로 매번 접속하면 그때마다 서버로의 요청과 응답으로 인한 지연 시간이 발생합니다. 이 시간을 없애서 성능 향상을 노리는 방식이 바로 클라이언트 측 캐싱 기능입니다.
클라이언트가 로컬에 데이터를 캐시로 저장하면, 다른 클라이언트가 캐싱된 키를 업데이트할 때 데이터의 정합성을 보장하기 위한 처리가 필요합니다. 레디스는 기본 모드로 서버 측에서 무효화 테이블이라 불리는 하나의 전역 테이블에 캐신된 키를 갖는 클라이언트의 목록을 기록해둡니다.