SCRIPT LOADとEVALSHA
SCRIPT LOADでスクリプトを読み込み、SHA1で実行して効率化します。
「SCRIPT LOADとEVALSHA」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
EVALの問題点
EVALは呼び出しのたびにスクリプト全文を送信します。頻繁に実行するスクリプトでは、帯域幅が無駄になります。SCRIPT LOADとEVALSHAを使えば、スクリプトを一度だけ読み込み、SHA1ハッシュで呼び出すことでこの問題を解決できます。
SCRIPT LOAD
SCRIPT LOAD scriptはスクリプトをコンパイルしてRedisにキャッシュし、そのSHA1ハッシュを返します。スクリプトは、サーバーが再起動するかSCRIPT FLUSHが呼び出されるまでキャッシュに残ります。
# Redis CLI:
SCRIPT LOAD "return redis.call('GET', KEYS[1])"
# Returns: "abc123...sha1hash..."EVALSHA
EVALSHA sha1 numkeys [keys] [args]は、SHA1で識別される、以前に読み込んだスクリプトを実行します。スクリプトがキャッシュされていない場合はNOSCRIPTで失敗します。
# Redis CLI:
EVALSHA abc123...sha1hash... 1 mykey
# Returns the same result as EVALアプリケーションのパターン
アプリケーションの起動時に、すべてのスクリプトをSCRIPT LOADで読み込み、SHA1を保存します。その後、実行時のすべての呼び出しにEVALSHAを使用します。
local redis = require("redis")
local scriptText = [[
local v = redis.call("GET", KEYS[1])
return v
]]
local sha = redis:script_load(scriptText)
-- Later:
redis:evalsha(sha, 1, "mykey")NOSCRIPTエラーへの対処
Redisが再起動すると、キャッシュされたスクリプトは失われます。NOSCRIPTエラーを捕捉し、EVALにフォールバックして再読み込みします。
local function safeEvalsha(r, sha, script, numkeys, ...)
local ok, result = pcall(r.evalsha, r, sha, numkeys, ...)
if not ok and result:find("NOSCRIPT") then
sha = r:script_load(script)
result = r:evalsha(sha, numkeys, ...)
end
return result
endSCRIPT EXISTS
SCRIPT EXISTS sha1 [sha1 ...]は、スクリプトがキャッシュされているかどうかを確認します。キャッシュ済みの各スクリプトには1、存在しないスクリプトには0を返します。再起動後の事前ウォームアップに使用します。
SCRIPT FLUSH
SCRIPT FLUSHは、Redisのメモリからキャッシュ済みのスクリプトをすべて削除します。スクリプトを変更したデプロイ時に使用します。
スクリプトのバージョン管理
スクリプトを変更すると、そのSHA1も変わります。SHA1をバージョン番号とともに保存し、デプロイ後に更新します。
帯域幅の節約
500バイトのスクリプトを毎秒10,000回呼び出す場合、EVALSHAはEVALと比べてRedisトラフィックを5 MB/s削減します。大規模環境では大きな差になります。
EVALSHAとRedisクラスター
クラスター�ードでも、スロットの制限に関してEVALSHAはEVALと同じように動作します。すべてのKEYSが同じスロットにある必要があります。
ベストプラクティス
本番環境では、起動時にスクリプトを読み込んだ後、常にEVALSHAを使用します。Redisの再起動後にも耐えられるよう、NOSCRIPTへのフォールバックを実装します。
EVALSHAに関する質問
EVALSHAはスクリプトテキストの代わりに何を使用しますか?
復習:SCRIPT LOADとEVALSHA
SCRIPT LOADでスクリプトを一度読み込み、SHA1を取得します。その後のすべての呼び出しにはEVALSHAを使用して、帯域幅を節約します。NOSCRIPTエラーが発生したら、再読み込みします。SCRIPT EXISTSでキャッシュの状態を確認し、SCRIPT FLUSHでキャッシュを消去します。
よくある質問
「SCRIPT LOADとEVALSHA」レッスンは無料ですか?
はい。「SCRIPT LOADとEVALSHA」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「SCRIPT LOADとEVALSHA」で何を学びますか?
SCRIPT LOADでスクリプトを読み込み、SHA1で実行して効率化します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「SCRIPT LOADとEVALSHA」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EVALとRedis Lua環境
- アトミック操作とトランザクション
- Luaによるレート制限
- SCRIPT LOADとEVALSHA