2014-01-15 3 views
-1

ServiceStack.Redis을 사용하여 C#을 통해 redis에 연결하려고합니다.루아 스크립트 최적화

아래의 코드는 지정된 키를 기준으로 숫자의 유효성을 검사하는 코드입니다.

argv[1]

argv[2]이 번호

string strScript = " local intCurrentVal = redis.call('GET', '' .. ARGV[1] .. ''); \n" 
    + "if (tonumber(intCurrentVal) <= 0) then return 1 elseif ( (tonumber(intCurrentVal)) - (tonumber('' .. ARGV[2] .. '')) < 0) then return 0 end;" 
    + "local intUpdatedVal = redis.call('SET', '' .. ARGV[1] .. '',(intCurrentVal - tonumber('' .. ARGV[2] .. '')));" 
    + "local intCurr = redis.call('GET', '' .. ARGV[1] .. ''); return intCurr"; 

논리 걸음 키이다

  • 전류 값이 0으로 다음 작거나 안
  • 선택하면 현재 값을 얻을
  • cur 임대 값 - 전달 0 다음 (현재 값 - 전달)을 설정하지 미만입니다 - 현재 값이 경우 전달 된 값 미만 O
  • 이어야한다 현재의 값으로
  • 현재 값을 얻을

성능을 위해 다음 lua 스크립트를 최적화하고 조정할 수 있습니까? 도와주세요.

+0

내부 트랜잭션 블록이어야합니다. – user2771292

+0

어떤 거래 블록입니까? – Schollii

+0

초당 수천 건의 트랜잭션에 대해 이야기하고 있습니까? 프로필을 작성하고 Lua 스크립트가 문제인 것을 발견 했습니까? – dualed

답변

1

원본 서식이 너무 끔찍하기 때문에 종종 성능이 좋습니다. 포함

local key = tostring(ARGV[1]) 
local number = tonumber(ARGV[2]) 

local current = tonumber(redis.call('GET', key)) 

if current <= 0 then 
    return 1 
elseif current < number then 
    return 0 
end 

redis.call('SET', key, current - number) 
return redis.call('GET', key) 

또한 최적화 단계 : 전역 함수의 지역화 (문자열 tonumber 등에 등), LUA_REGISTRYINDEX 테이블에 캐싱 컴파일 청크.

+0

해결책을 가지고 동의하지만 하나의 트랜잭션 블록 내부에 같은 것을 통합하고자합니다. 이것이 루아 스크립트를 사용하는 이유입니다. – user2771292

+0

마지막 2 줄 INCRBY API가 redis를 호출 할 때 마지막 줄을 바꿉니다. – user2771292