Redis에 관해서는, 모두가 자주 사용하며, 가장 많이 사용되는 시나리오는 데이터 캐싱입니다.
복습
redis 2.6.0부터 redis는 내장된 Lua 인터프리터를 갖추고 있으며, Lua 스크립트 평가를 파싱하는 eval 명령어를 제공합니다.
문법: eval script numkeys keys args
조건:
eval — Redis는 Lua 스크립트를 파싱하는 명령을 제공합니다
스크립트 — 루아 스크립트
numkeys — 키명 매개변수 집합에 포함된 키 수를 지정합니다
키 — 전역 변수 KEYS 배열로 표현되는 키이름 매개변수 집합으로, 1의 첨자로 시작합니다
args — 전역 변수 배열로 표현되는 키값 매개변수 집합으로, 첨자 1로 시작합니다
Redis에서 Lua 사용의 장점
네트워크 오버헤드를 줄이세요. 네트워크 지연을 줄이기 위해 스크립트 형태로 여러 요청을 동시에 보낼 수 있습니다 원자 조작. REDIS는 전체 스크립트를 실행하며, 그 사이에 다른 명령어는 삽입하지 않습니다. 따라서 스크립팅 과정에서 경쟁 조건과 트랜잭션에 대해 걱정할 필요가 없습니다. 복직. 클라이언트가 보낸 발자국 소리는 redis에 지속적으로 저장되어, 다른 클라이언트가 동일한 로지를 코드를 사용하지 않고도 스크립트를 재사용할 수 있습니다.
스크립트 원자성
Lua 스크립트는 시간 소모적인 연산이나 데드 루프를 가질 수 없으며, 그렇지 않으면 redis가 다른 명령을 받아 스크립트 실행을 멈추지 않습니다
Redis는 모든 스크립트를 단일 Lua 인터프리터로 실행하며, 스크립트가 원자적으로 실행되도록 보장합니다.즉, 스크립트가 실행 중일 때 다른 스크립트나 redis 명령어는 실행되지 않습니다! 따라서 현재 스크립트가 느리게 실행된다면, 서버가 바빠서 명령을 실행할 수 없을 수 있습니다. 예를 들어:
각 스크립트는 최대 실행 시간 제한이 있으며, 기본 값은 5초입니다. 최대 실행 시간은 구성 파일 redis.conf의 lua-time-limit 옵션으로 제어하거나, config get과 config set 명령어를 직접 사용하여 제어할 수 있습니다. 스크립트 실행이 최대 실행 시간에 도달하면 Redis는 이를 적극적으로 종료하지 않고 다음 단계를 수행합니다:
(1) Redis가 스크립트의 시간이 부족하다고 기록합니다
(2) Redis는 다른 클라이언트의 요청을 다시 받기 시작하지만, 스크립트 킬 명령 실행과 노세이브 종료만 허용합니다.
(3) 스크립트가 읽기 작업만 수행한다면, 스크립트 킬 명령을 사용해 즉시 스크립트를 멈춥니다; 스크립트가 쓰기 작업을 수행하면, 현재 데이터가 디스크에 쓰이지 않도록 서버를 멈추는 것은 종료 저장/저장 명령만 허용됩니다. (이 시점에서 서버가 다운되어 데이터가 저장되지 않습니다)
본보기
스크립트를 실행하세요. 매개변수는 키와 값 2이고, 명령어는 다음과 같습니다:
데드루프 스크립트에서 다음 스크립트를 실행하면 redis가 다른 명령을 처리할 수 없게 되어 멈추게 됩니다:
다음 명령어로 문자열 타입의 데이터를 추가하는 스크립트를 사용해 보세요:
더 복잡한 스크립트를 실행하세요. 키 값이 우리가 전달한 값과 같으면 캐시를 삭제하고, 그렇지 않으면 아무 동작도 하지 마세요. 명령어는 다음과 같습니다:
구현 결과는 다음과 같습니다:
(끝)
|