lua_intro
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ここで最後の 0 は引数として入力するキー個数です。なければ 0 です。
OK
> EVAL "return redis.call('get', 'key')" 0
value
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')" 0AOF
OK - 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"
| Commands | Version | Syntax | Description |
|---|---|---|---|
| EVAL | 2.6.0 | Script | スクリプト実行 |
| EVALSHA | 2.6.0 | SHA | 保存されたスクリプト実行 |
| SCRIPT LOAD | 2.6.0 | Script | スクリプトロード |
| SCRIPT INFO | Ent 6.0.0 | スクリプト情報照会 | |
| SCRIPT LIST | Ent 6.0.0 | Full | スクリプトリスト照会 |
| SCRIPT GET | Ent 6.0.0 | SHA | スクリプト照会 |
| SCRIPT EXISTS | 2.6.0 | SHA | 確認 |
| SCRIPT FLUSH | 2.6.0 | メモリからスクリプトを消去 | |
| SCRIPT KILL | 2.6.0 | 実行中のスクリプトを kill | |
| SCRIPT DEBUG | 3.2.0 | デバッグ |
Total : 10
| << Pub/Sub Intro | Lua Script Intro | EVAL >> |
|---|
Email
返事がかかってなれば、メールでお知らせします。
