Lua 스크립트 - Amazon ElastiCache

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Lua 스크립트

Valkey 또는 Redis OSS는 Lua 스크립트 실행 명령을 포함하여 200개 이상의 명령을 지원합니다. 그러나 Lua 스크립트의 경우 Valkey 또는 Redis OSS의 메모리 및 가용성에 영향을 줄 수 있는 몇 가지 문제가 있습니다.

파라미터화되지 않은 Lua 스크립트

각 Lua 스크립트는 실행 전에 Valkey 또는 Redis OSS 서버에 캐시됩니다. 파라미터화되지 않은 Lua 스크립트는 고유하므로 Valkey 또는 Redis OSS 서버가 많은 수의 Lua 스크립트를 저장하고 더 많은 메모리를 사용할 수 있습니다. 이를 완화하려면 모든 Lua 스크립트가 파라미터화되었는지 확인하고 필요한 경우 정기적으로 SCRIPT FLUSH를 수행하여 캐시된 Lua 스크립트를 정리합니다.

또한 키를 제공해야 합니다. KEY 파라미터의 값이 제공되지 않으면 스크립트가 실패합니다. 예를 들어 다음과 같은 경우에는 작동하지 않습니다.

serverless-test-lst4hg.serverless.use1.cache.amazonaws.com:6379> eval 'return "Hello World"' 0 (error) ERR Lua scripts without any input keys are not supported.

이 작업은 다음과 같이 작동합니다.

serverless-test-lst4hg.serverless.use1.cache.amazonaws.com:6379> eval 'return redis.call("get", KEYS[1])' 1 mykey-2 "myvalue-2"

다음 예제는 파라미터화된 스크립트를 사용하는 방법을 보여 줍니다. 먼저 3개의 캐시된 Lua 스크립트가 생성되는 파라미터화되지 않은 접근 방식의 예제가 있으며 이 방식은 권장하지 않습니다.

eval "return redis.call('set','key1','1')" 0 eval "return redis.call('set','key2','2')" 0 eval "return redis.call('set','key3','3')" 0

대신 다음 패턴을 사용하여 전달된 파라미터를 사용할 수 있는 단일 스크립트를 생성합니다.

eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key1 1 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key2 2 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key3 3

장기 실행 Lua 스크립트

Lua 스크립트는 여러 명령을 세부적으로 실행할 수 있으므로 일반 Valkey 또는 Redis OSS 명령보다 완료하는 데 시간이 더 오래 걸릴 수 있습니다. Lua 스크립트가 읽기 전용 작업만 실행하는 경우 중간에 중지할 수 있습니다. 하지만 Lua 스크립트는 쓰기 작업을 수행하는 즉시 종료할 수 없으므로 실행을 완료해야 합니다. 장기 실행 Lua 스크립트가 변경되면 Valkey 또는 Redis OSS 서버가 오랫동안 응답하지 않을 수 있습니다. 이 문제를 완화하려면 장기 실행 Lua 스크립트를 사용하지 말고 사전 프로덕션 환경에서 스크립트를 테스트해 보세요.

Stealth 쓰기 기능이 있는 Lua 스크립트

Valkey 또는 Redis OSS가 maxmemory를 초과한 경우에도 Lua 스크립트가 Valkey 또는 Redis OSS에 새 데이터를 계속 쓸 수 있는 몇 가지 방법이 있습니다.

  • 스크립트는 Valkey 또는 Redis OSS 서버가 maxmemory 이하일 때 시작되며 내부에는 여러 쓰기 작업이 포함됩니다.

  • 스크립트의 첫 번째 쓰기 명령은 메모리(예: DEL)를 사용하지 않고, 이어서 메모리를 사용하는 쓰기 작업이 늘어납니다.

  • noeviction이 아닌 Valkey 또는 Redis OSS 서버에서 적절한 제거 정책을 구성하여 이 문제를 완화할 수 있습니다. 이렇게 하면 Redis OSS는 항목을 제거하고 Lua 스크립트 간에 메모리를 정리할 수 있습니다.