본문 바로가기

좋아하는 것_매직IT/9.redis

35.Redis, 레디스에서 루아(Lua) 스크립트를 한번 실행해 볼까요?

반응형

레디스와 루아(Lua)에 대해서 알아볼께요^^;

  • 레디스 2.6버전에 처음으로 루아 스크립트 엔진이 추가되었음.
    • 다시말해서, Redis 서버에서 루아(Lua) 스크립트를 실행할 수 있게됨.

레디스에서 루아 스크립트를 사용했을때 장점은?

  • 사용자가 마음대로 새로운 명령을 생성할 수 있음.
  • 생성한 명령은 Redis의 일반 명령과 동일한 수준의 트랜잭션과 실행 특징을 보장받을 수 있다고함.
    • 위의 특징은 장점이자 큰 단점이 될 수 도 있음.
      • 즉, 사용자가 작성한 스크립트가 실행되는 동안에는 다른 Redis 명령이 실행되지 못하므로 작성한 스크립트는 반드시 실행 시간에 대한 고려를 포함해야함

레디스에서 수행되는 루아 스크립트의 특징은?

  • Redis에서 루아 스크립트를 실행할 때 스크립트에 대한 인수를 입력할 수 있음.
  • 루아 스크립트에서 Redis 명령을 사용할 수 있음.
  • Redis 서버에서 실행되는 루아 스크립트는 원자적으로 처리됨.

그럼, 레디스에서 루아를 실행해 볼께요 ^^;

  • 루아 스크립트를 실행하는 방법 2가지
    • 첫번째, 단일 실행
      • EVAL 명령을 사용하여 수행하고자 하는 루아 스크립트를 매번 Redis 로 전송하는 것.
        • 이 방법은 간단한 스크립트를 작성하고 사용하는데 최적화
        • but,  수행된 스크립트는 바로 버려지므로, 다음에 똑같은 스크립트를 실행하고자할때는, 다시 동일한 스크립트를 수행해야되는 단점이 존재함.
    • 두번째, 스크립트 등록 실행 
      • SCRIPT LOAD 명령을 사용하여 수행할 스크립트를 Redis 서버에 미리 등록해 두는 것.
        • SCRIPT LOAD 명령을 실행하면, 해당 스크립트에 대한 sha1 문자열을 생성함.
          • 생성된 sha1 문자열은 EVALSHA 명령으로 실행 가능함. 
            • 즉, 다시 동일한 스크립트를 전송할 필요가 없음.
        • 즉, 반복되거나 재사용이 필요한 명령은 SCRIPT LOAD로 Redis 서버에 미리 등록해 두는 것이 좋음.

그럼, 단일실행(EVAL) 과 스크립트 등록 실행(SCRIPT LOAD / EVALSHA) 명령에 대해서 알아볼께요.

  • 단일실행
    • EVAL
      • 구문
        • redis> EVAL lua_script numkeys key [key ...] arg [arg ...]
      • 예시
        • 실행할 Lua 스크립트

실행할 EVAL 명령

redis> eval "local sum = ARGV[1] + ARGV[2] local res = redis.call('SET', KEYS[1], sum) return res" 1 thub_test:key 1000 2000
  • 설명
    • ARGV 변수와 KEYS 변수는 각각 스크립트 인수와 Redis 의 Key 에 해당됨.
    • 루아(Lua) 스크립트는 C++ / JAVA와 같이 명령의 종료를 구분하기 위해서 특별한 구분자를 사용하지 않음. 
      • 즉, 단순히 공백 문자를 사용하여 명령과 명령을 구분함.
    • 실행결과
  • 스크립트 등록 실행
    • SCRIPT LOAD
      • 구문
        • redis> SCRIPT LOAD lua_script
      • 예시
        • 실행할 SCRIPT LOAD 명령
redis> script load "local sum = ARGV[1] + ARGV[2] local res = redis.call('SET', KEYS[1], sum) return res"
  • 실행결과
    • ​​​​​​​
      • 설명
        • script load 명령으로 Redis 서버에 루아(Lua) 스크립트를 저장하고 저장된 루아 스크립트에 대한 sha1 키값을 생성함.
  • EVALSHA
    • 구문
      • redis> EVALSHA sha1 numkeys key [key ...] arg [arg ...]
    • 예시
      • 실행할 EVALSHA 명령
redis> evalsha d8f846826ead0d8efed3ebd5515499de6becbe8b 1 thub_test_evalsha:key 300 500
  • 실행결과
      • 설명
        • 위의 결과와 같이 script load 명령 후 반환된 sha1 값을 가지고 실행시킬 수 있음을 확인해보았음.

결론

  • 레디스에서 루아 스크립트를 사용해서 단일 실행 및 스크립트 등록 실행을 할 수 있음.
  • 레디스 개발자가 마음대로 루아(Lua) 스크립트를 사용해서 새로운 명령을 생성할 수 있음.
  • 오늘도 레디스 관련 루아(Lua) 스크립트 사용에 대한 마술(?) 한가지 획득완료, 감사합니다. ^^
728x90
300x250