RedisでLuaを使用するいくつかの最適化と注意事項
1962 ワード
EVAL、EVALSHAコマンド
スクリプトのパフォーマンス
帯域幅の最適化実行ごとに Luaスクリプトの
Redis ClusterまたはアリクラウドRedisクラスタ版の使用上の注意事項
Redisは3.0からCluster機能をサポートしており、以前は ERR Error running script (call to f_4a610f5543b3c3450220da7bd47825d3b6bffae8): @user_script:1: @user_script: 1: Lua script attempted to access a non local key in a cluster node ERR eval/evalsha command keys must be in same slot(アリクラウドRedisクラスタ版) 上記のエラーは、Redisが単一のLuaスクリプト操作を要求するkeyが同じノードにある必要があるためですが、Clusterはデータを自動的に異なるノードに分散します(仮想の16384個のslot、具体的には公式ドキュメントを参照).アリクラウド版の公式サイトにも、Redisクラスタ版のインスタンスでは、トランザクション、スクリプトなどのコマンドがすべてのkeyが同じslotにある必要があります.同じslotで次のエラーメッセージが返されない場合(:command keys must in same slot)
どのように解決しますか?
CLUSTER KEYSLOT keyのドキュメントでは解決策が提供されています.keyの一部を
考える
ある業務が
Redis
は、バージョン2.6.0からeval
コマンドを提供し、Lua
インタプリタを内蔵することで、ユーザーにLua
スクリプトを実行させ、データを返すことができます.Redis
シングルスレッドモデルの特徴で、複数のコマンドが保証されている
(最近のプロジェクトではLuaを使いたいと思っていますので)、詳細な使い方は公式ドキュメントに移行してください.スクリプトのパフォーマンス
Redis
はスクリプト実行の原子性を保証しているので、現在のスクリプトが実行されないまで、他のコマンドもスクリプトも待機状態であるため、スクリプト中の内容を必ず制御し、多くの時間を費やす内容(論理が比較的簡単)が発生しないようにしなければならない.帯域幅の最適化
Lua
のスクリプトコンテンツが重複して送信されないようにするために、Redis
はevalsha
コマンドを提供し、LuaスクリプトコンテンツのSHA 1チェックサムを送信するだけでよい(evalsha 6b1bf486c81ceb7edf3c093f4c48582e38c0e791 0
).
(ダイナミックデータ)はKEYS
とARGV
を使用して取得してください.
をスクリプトに入れると、毎回スクリプトの内容が異なる(SHA 1)、Redisは無駄なスクリプトまたは使い捨てのスクリプトの内容を大量にキャッシュします.Redis ClusterまたはアリクラウドRedisクラスタ版の使用上の注意事項
Redisは3.0からCluster機能をサポートしており、以前は
eval
を使用していた場合は問題なかったかもしれませんが、Clusterモードに切り替えると、いくつかの問題が発生する可能性があります.どのように解決しますか?
CLUSTER KEYSLOT keyのドキュメントでは解決策が提供されています.keyの一部を
{}
で包む必要があります.redisは{}
の中間の内容を通じてslotを計算するkeyとして使用します.key1{mykey}
、key2{mykey}
のようなものは同じslotに保存されます(欠点は滑らかな過度な古い業務ではありません.元のkeyを修正する必要があります.前のkeyが統一的に管理されていれば、それほど面倒ではありません).考える
ある業務が
key{mykey}
を通じて取得コンテンツを格納すると、すべての操作が同じslotにhashされ、このslotが存在するノードの圧力が大きくなり(不均衡)、解決すれば?コメント討論を歓迎します~