Lua Introduction

Redis 開発者教育の申込 Redis 定期点検/技術サポート
Redis Technical Support
Redis エンタープライズサーバー
Redis Enterprise Server

紹介

Redis version 2.6.0 から Lua interpreter を内蔵して Lua script を実行できます。   Lua 5.1 を使います。   この文書は Redis version 5.0.7 を基準に作成しました。

コマンド説明

EVAL

  • Lua script を実行します。引数(argument)なしで使う場合
    > EVAL "return redis.call('set', 'key', 'value')" 0
    OK
    > EVAL "return redis.call('get', 'key')" 0
    value
    ここで最後の 0 は引数として入力するキー個数です。なければ 0 です。

SCRIPT LOAD, EVALSHA

  • スクリプトを繰り返し使う場合、スクリプトを LOAD すると SHA 値が返されます。 この値でスクリプトを繰り返し実行できます。 スクリプトは Redis にキャッシュされます。
    EVALSHA を使う場合、引数を使うと効果的に繰り返し使えます。
    > SCRIPT LOAD "return redis.call('set', KEYS[1], ARGV[1])"
    "55b22c0d0cedf3866879ce7c854970626dcef0c3"
    > EVALSHA 55b22c0d0cedf3866879ce7c854970626dcef0c3 1 key10 value10
    OK
    > EVALSHA 55b22c0d0cedf3866879ce7c854970626dcef0c3 1 key11 value11
    OK
    キーが複数ある場合
    > SCRIPT LOAD "return redis.call('mset', KEYS[1], ARGV[1], KEYS[2], ARGV[2])"
    "e290a9e5f8bdb9b954e332de5e6b661e4ea31c08"
    > EVALSHA e290a9e5f8bdb9b954e332de5e6b661e4ea31c08 2 key10 key11 value10 value11
    OK
  • スクリプトサイズが大きい場合 LOAD して使うと 毎回 EVAL で実行するより network 通信量を減らすのに役立ちます。

SCRIPT INFO

  • Lua interpreter が使うメモリ、キャッシュされたスクリプトが使うメモリ、スクリプト個数を照会します。 ここに表示される情報は info memory に表示される Lua 情報と同じです。

SCRIPT LIST

  • キャッシュされたスクリプトリストを照会します。Sha と Script は 70バイトまで表示されます。 FULL オプションを使うと 32767バイトまで照会できます。

SCRIPT GET

  • Sha で Script を照会します。このときはスクリプトサイズに制限なく全体を照会します。

SCRIPT EXISTS

  • SHA でスクリプトがキャッシュ(load)されているか確認します。
    > SCRIPT EXISTS e290a9e5f8bdb9b954e332de5e6b661e4ea31c08
    1) (integer) 1

SCRIPT FLUSH

  • メモリにキャッシュされた Lua スクリプトをすべて消去(flush)します。

SCRIPT KILL

  • 実行中の Lua スクリプトを kill します。
    条件は lua-time-limit が過ぎ、Script 内で書き込み(write)コマンドを実行していないときです。
    詳しい内容は SCRIPT KILL コマンドを参照してください。

INFO MEMORY

  • Lua スクリプト関連情報を見られます。
    > info memory
    ... 中略 ...
    used_memory_lua:90112   -> Lua エンジンが使うメモリ
    used_memory_lua_human:88.00K
    used_memory_scripts:3976   -> スクリプトが使うメモリ (5.0 追加)
    used_memory_scripts_human:3.88K
    number_of_cached_scripts:27   -> スクリプト個数 (5.0 追加)

AOF, レプリケーション(Replication)

  • Redis 5.0 からは MULTI/EXEC コマンドで記録されレプリカノードに伝播されます。
    > EVAL "return redis.call('set','key','value')" 0
    OK
    AOF
  • Redis 4.x まではスクリプトが記録され伝播されます。
  • ただしこのバージョンでも redis.replicate_commands() を実行するとコマンドが記録されます。
    > EVAL "redis.replicate_commands() return redis.call('set','key','value')" 0
  • AOF REWRITE: 記録されません。
  • RDB: 記録されます。レプリカノードに伝播されます。

SELECT

  • DB を選ぶ select コマンドは使用できます。 ただしスクリプト内でのみ適用されます。
    > EVAL "redis.call('select',2) return redis.call('set','key','value')" 0

SCRIPT 内で使用できないコマンド

  • ほとんどのコマンドは使えますが、次のいくつかのコマンドは使えません。
  • BLPOP, BRPOP, BZPOPMIN, BZPOPMAX のような Blocking コマンドは使えません。
  • PUBLISH コマンドは使えますが、SUBSCRIBE コマンドは使えません。
  • EVAL, SCRIPT, MULTI, EXEC コマンドは使えません。
  • 管理(admin)コマンドは使用不可: SAVE, BGSAVE, BEREWRITEAOF, LATENCY, SLOWLOG, REPLICAOF, DEBUG, ROLE, AUTH, SHUTDOWN, ...

Lua 関連パラメータ

  • lua_time_limit 5000(5秒): この時間を過ぎると実行中のスクリプトを kill できます。

Lua Script 活用

  • keys myset* : キーリスト照会
    > EVAL "return redis.call('keys','myset*')" 0
    1) "myset1"
    2) "myset2"
  • 個数表示: 前に # を付けると個数を照会します。
    > EVAL "return #redis.call('keys','myset*')" 0
    (integer) 2
  • 照会したキーが SET の場合、キーのメンバーを照会します。
    > EVAL "local members = redis.call('keys','myset*') local results = {} for index,key in ipairs(members) do results[index] = redis.call('smembers',key) end return results" 0
    1) 1) "BBB"
        2) "AAA"
    2) 1) "DDD"
        2) "EEE"
        3) "CCC"
  • この場合、照会したキーが SET でなければ "(empty list or set)" を返します。 この場合 SET data type だけ照会するため Enterprise バージョンでは 'set' オプションを追加できます。
    > EVAL "local members = redis.call('keys','myset*','set') local results = {} for index,key in ipairs(members) do results[index] = redis.call('smembers',key) end return results" 0
  • STRING キーの値の合計を求めます。
    > set key10 10
    > set key20 20
    > set key30 30
    > EVAL "local members = redis.call('keys','key*','string') local total = 0 for index,key in ipairs(members) do total = total + redis.call('get',key) end return total" 0
    (integer) 60
  • Hash サンプルデータ入力
    script load "local num = 0 while num < tonumber(ARGV[1]) do num = num + 1 redis.call('hset','myhash','field-'..num, 'value-'..num) end return num"

Lua コマンドリスト

CommandsVersionSyntaxDescription
EVAL2.6.0Scriptスクリプト実行
EVALSHA2.6.0SHA保存されたスクリプト実行
SCRIPT LOAD2.6.0Scriptスクリプトロード
SCRIPT INFOEnt 6.0.0スクリプト情報照会
SCRIPT LISTEnt 6.0.0Fullスクリプトリスト照会
SCRIPT GETEnt 6.0.0SHAスクリプト照会
SCRIPT EXISTS2.6.0SHA確認
SCRIPT FLUSH2.6.0 メモリからスクリプトを消去
SCRIPT KILL2.6.0 実行中のスクリプトを kill
SCRIPT DEBUG3.2.0 デバッグ

Total : 10


<< Pub/Sub Intro Lua Script Intro EVAL >>

Email 返事がかかってなれば、メールでお知らせします。