Redis용 Lua 스크립트 작성 및 애플리케이션

WBOY
풀어 주다: 2023-05-11 17:17:09
원래의
1986명이 탐색했습니다.

Redis는 오픈 소스 키-값 쌍 저장소 데이터베이스이며 Lua 스크립트는 Redis의 매우 강력한 프로그래밍 도구입니다. Lua는 Redis 서버의 확장 언어로 사용할 수 있는 가볍고 효율적인 스크립팅 언어입니다. 이 기사에서는 Redis에서 Lua 스크립트의 작성, 호출 방법 및 실제 적용을 소개합니다.

1. Redis의 Lua 스크립팅

1.1 Lua 스크립팅 언어 소개

Lua 스크립트는 경량 언어로서 매우 작은 특정 구문 세트, 동적으로 유형이 지정된 언어 및 우수한 성능과 같은 많은 기능을 가지고 있지만 이러한 특성이 Lua를 만드는 이유입니다. 특정 문제를 해결하는 데 더 적합한 스크립트입니다.

1.2 Redis에서 Lua 스크립트 언어의 장점과 단점

장점:

  • 원자성: Lua 스크립트는 원자성이며 다른 클라이언트에 의해 중단되지 않으며 개별적으로 실행됩니다.
  • 재사용성: Lua 스크립트의 코드는 여러 REDIS 노드에서 재사용할 수 있습니다.
  • 뛰어난 성능: Lua 스크립트 인터프리터와 Redis 서버는 프로세스를 공유하여 매우 효율적인 성능을 달성합니다.

단점:

  • 디버그 어려움: Lua 스크립트의 언어 기능은 Redis 언어 기능과 다르며 Lua 스크립트를 완전히 조사하기 어렵습니다.
  • Redis와 Lua 스크립트 간의 링크: Lua 스크립트는 클라이언트를 통해 전달되어야 하며 끝은 매개변수를 전달하고 데이터를 반환하는 데 사용되며 이로 인해 추가 오버헤드가 추가됩니다.

1.3 Redis의 Lua 스크립팅 규칙

  • Redis에서 사용하는 Lua 환경은 5.1이며 버전 5.2의 일부 확장 구문과 호환됩니다.
  • 모든 Redis 명령은 Redis.call을 통해 호출해야 합니다. 값 참조는 KEYS 또는 ARGV를 사용하여 전달되어야 합니다.
  • 모든 오류 처리는 오류 함수를 사용해야 합니다.
  • 1.4 Redis의 Lua 스크립트 코드 예

다음은 카운터의 Lua 스크립트 예입니다.

local count = tonumber(redis.call("get", KEYS[1])) 또는 0

if count > ; tonumber(ARGV[1]) then

redis.call("set", KEYS[1], ARGV[1]) return 0
로그인 후 복사

else

count = redis.call("incr", KEYS[1]) return count
로그인 후 복사

end

2. Redis에서 Lua 스크립트를 호출하는 방법

Redis에서 Lua 스크립트를 호출하는 방법에는 두 가지가 있습니다.

2.1 EVAL 명령 사용

Redis 작성된 Lua 스크립트를 실행하는 데 사용할 수 있는 EVAL 명령이 제공됩니다.

구문:

EVAL 스크립트 numkeys key [key ...] arg [arg ...]


예:

redis.eval('return redis.call("GET", KEYS[1])', 1 , "mykey")

2.2 SCRIPT LOAD 명령 사용

Redis에서는 SCRIPT LOAD 명령을 사용하여 Lua 스크립트를 미리 로드한 후 SHA1 해시 값을 호출하여 스크립트를 실행할 수도 있습니다.

구문:

SCRIPT LOAD 스크립트


예:

local script = [[

local key = KEYS[1] local max_count = tonumber(ARGV[1]) local current_count = tonumber(redis.call("get", key)) if current_count and current_count >= max_count then redis.call("del", key) end redis.call("incr", key) return true
로그인 후 복사

]]

local key = 'limiter:xxx'

local max_count = 10

local script_sha = redis.call('SCRIPT' , 'LOAD', script)
redis.call('EVALSHA', script_sha, 1, key, max_count)

3. Redis의 Lua 스크립트 적용 예

3.1 분산 잠금

분산 잠금에는 모든 Redis 노드가 필요합니다. 동일한 스크립트 코드를 가지도록 하면 애플리케이션의 실행 효율성이 향상될 수 있습니다.

분산 잠금을 구현하는 Lua 스크립트의 예:

local lock_key = KEYS[1]

local lock_timeout = tonumber(ARGV[1])

local lock_value = KEYS[2]
local lock_valid_time = tonumber(ARGV[2])

if redis.call("set", lock_key, lock_value, "NX", "EX", lock_timeout) then

redis.call("expire", lock_key, lock_valid_time) return lock_value
로그인 후 복사

else

return nil
로그인 후 복사

end

3.2 Ordered set 페이징 쿼리

Redis Ordered Set은 페이징 쿼리 기능을 제공합니다. 점수 범위에 따라 정렬된 컬렉션에서 페이징 쿼리를 수행할 수 있습니다.

순서 있는 컬렉션 페이징 쿼리를 구현하는 Lua 스크립트의 예:

local page_no = tonumber(ARGV[1])

local page_size = tonumber(ARGV[2])

local start = (page_no - 1) * page_size
local stop = page_no * page_size - 1
local opts = {score_cast_func = tonumber}

local result = {}

local data = redis.call("ZRANGE", KEYS[1], start, stop, "WITHSCORES")

for idx = 1, #data, 2 do

local k = data[idx] local v = tonumber(data[idx + 1]) table.insert(result, {k, v})
로그인 후 복사

end

return result

결론:

Lua 스크립트는 Redis에서 매우 강력한 도구이므로 Lua 스크립트의 작성 및 호출 방법이 매우 중요합니다. 실제 애플리케이션에서는 특정 애플리케이션 시나리오에 해당하는 Lua 스크립트를 작성하여 Redis의 성능과 실행 속도를 향상시킬 수 있습니다.

위 내용은 Redis용 Lua 스크립트 작성 및 애플리케이션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.