検索
ホームページデータベースRedisRedis->eval() の利点は何ですか?

Redis を使用するときに get() と set() をよく使用しますか?実際、Redis には便利なデータ構造とさまざまなメソッドが多数あります。今日は eval() メソッドをテストします。

推奨: 「Redis ビデオ チュートリアル

Redis Eval 公式説明 (抜粋)

EVAL script numkeys key [key ...] arg [arg ...]

Redis 2.6.0 よりバージョン 1 以降、組み込みの Lua インタープリターを通じて、EVAL コマンドを使用して Lua スクリプトを評価できるようになりました。

Redis は、単一の Lua インタープリターを使用してすべてのスクリプトを実行します。また、Redis は、スクリプトがアトミックな方法で実行されることも保証します。スクリプトの実行中、他のスクリプトや Redis コマンドは実行されません。これは、MULTI / EXEC で囲まれたトランザクションを使用するのと非常に似ています。他のクライアントの観点からは、スクリプトの効果は見えないか、すでに完了しています。

一方で、これは、遅いスクリプトを実行するのは得策ではないことも意味します。スクリプトの実行オーバーヘッドは非常に小さいため、高速かつスムーズに実行されるスクリプトを作成することは難しくありませんが、実行が遅いスクリプトを使用する必要がある場合は、注意してください。これらのカタツムリ スクリプトが遅い場合、 Tuntundi を実行すると、サーバーがビジー状態になるため、他のクライアントはコマンドを実行できなくなります。

実際の測定

私の理解では、Redis の eval() メソッドは通常、目標を完了するために複数の Redis 操作を実行する必要があるシナリオで使用されます。

以下では、redis を 100 回操作するシナリオをシミュレーションしました。もちろん、これは実際には必要ないかもしれません。違いを皆さんに見てもらいたいだけです。

<?php
 
$redis = new \Redis;
$redis->connect(&#39;127.0.0.1&#39;, 6379);
 
// 清空Redis
$redis->flushDB();
 
// PHP 中循环 set
$t = microtime(true);
for($i = 0; $i < 100; ++$i)
{
    $redis->set(&#39;key&#39; . $i, $i);
}
echo &#39;php for set: &#39;, microtime(true) - $t, PHP_EOL;
 
// 清空Redis
$redis->flushDB();
 
// 使用 eval 方法
$t = microtime(true);
$keys = [];
$values = [];
for($i = 0; $i < 100; ++$i)
{
    $keys[] = &#39;key&#39; . $i;
    $values[] = $i;
}
$redis->eval(<<<SCRIPT
for i=1,#KEYS do
    redis.call(&#39;set&#39;, KEYS[i], ARGV[i])
end
SCRIPT
, array_merge($keys, $values), count($keys));
echo &#39;eval:&#39;, microtime(true) - $t, PHP_EOL;

結果:

php for set: 0.056596040725708
eval:0.00089216232299805

明らかに、コード内でループを設定するよりも eval の方が圧倒的に高速です。

....

これで終わったと思いますか? ######いいえ!

evalSha 調べてみませんか?

EvalSha 説明

EVALSHA sha1 numkeys key [key ...] arg [arg ...]
指定された sha1 チェック コードに基づいて、サーバーにキャッシュされたスクリプトを評価します。

スクリプトをサーバーにキャッシュする操作は、SCRIPT LOAD コマンドを通じて実行できます。

このコマンドのその他の点 (パラメーターを渡す方法など) は、EVAL コマンドと同じです。

EvalSha の実測値

<?php
function testEval($redis)
{
    $keys = [];
    $values = [];
    for($i = 0; $i < 100; ++$i)
    {
        $keys[] = &#39;key&#39; . $i;
        $values[] = $i;
    }
    $redis->eval(<<<SCRIPT
for i=1,#KEYS do
    redis.call(&#39;set&#39;, KEYS[i], ARGV[i])
end
SCRIPT
, array_merge($keys, $values), count($keys));
}
 
function testEvalSha($redis)
{
    $keys = [];
    $values = [];
    for($i = 0; $i < 100; ++$i)
    {
        $keys[] = &#39;key&#39; . $i;
        $values[] = $i;
    }
    $redis->evalSha(sha1(<<<SCRIPT
for i=1,#KEYS do
    redis.call(&#39;set&#39;, KEYS[i], ARGV[i])
end
SCRIPT
    ), array_merge($keys, $values), count($keys));
}
 
$redis = new \Redis;
$redis->connect(&#39;127.0.0.1&#39;, 6379);
 
// 清空Redis
$redis->flushDB();
 
// 使用 eval 方法
$t = microtime(true);
for($i = 0; $i < 100; ++$i)
{
    testEval($redis);
}
echo &#39;eval:&#39;, microtime(true) - $t, PHP_EOL;
 
 
// 清空Redis
$redis->flushDB();
 
// 使用 evalSha 方法
$t = microtime(true);
for($i = 0; $i < 100; ++$i)
{
    testEvalSha($redis);
}
echo &#39;evalSha:&#39;, microtime(true) - $t, PHP_EOL;

結果:

eval:0.081475973129272
evalSha:0.076005220413208
私のテスト結果から、evalSha は eval より速くありません。大幅な改善。

ただし、実稼働環境では、evalSha を使用すると、eval よりも小さなデータ パケットが送信され、占有するネットワーク リソースが少なくなります。

eval は毎回完全なスクリプトを Redis に送信する必要があり、evalSha は sha1 を渡すだけでよいためです。

evalSha は、eval が 1 回実行された後でのみ直接呼び出すことができます。

利点

以下は私がカプセル化したメソッドです。最初は evalSha を使用して試し、失敗した場合は eval メソッドを使用してください。

rree

以上がRedis->eval() の利点は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はyurunsoftで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Redis vs.その他のデータベース:比較分析Redis vs.その他のデータベース:比較分析Apr 23, 2025 am 12:16 AM

他のデータベースと比較して、Redisには次の独自の利点があります。1)非常に速い速度、および読み取り操作は通常、マイクロ秒レベルにあります。 2)豊富なデータ構造と操作をサポートします。 3)キャッシュ、カウンター、公開サブスクリプションなどの柔軟な使用シナリオ。 Redisまたはその他のデータベースを選択する場合、特定のニーズとシナリオに依存します。 Redisは、高性能および低遅延のアプリケーションでうまく機能します。

Redisの役割:データストレージと管理機能の調査Redisの役割:データストレージと管理機能の調査Apr 22, 2025 am 12:10 AM

Redisは、データストレージと管理において重要な役割を果たしており、複数のデータ構造と持続性メカニズムを通じて最新のアプリケーションの中核となっています。 1)Redisは、文字列、リスト、コレクション、注文されたコレクション、ハッシュテーブルなどのデータ構造をサポートし、キャッシュや複雑なビジネスロジックに適しています。 2)RDBとAOFの2つの持続方法を通じて、Redisは信頼できるストレージとデータの迅速な回復を保証します。

Redis:NOSQLの概念の理解Redis:NOSQLの概念の理解Apr 21, 2025 am 12:04 AM

Redisは、大規模なデータの効率的なストレージとアクセスに適したNOSQLデータベースです。 1.Redisは、複数のデータ構造をサポートするオープンソースメモリデータ構造ストレージシステムです。 2.キャッシュ、セッション管理などに適した、非常に速い読み取り速度と書き込み速度を提供します。 4.使用例には、基本的なキー値ペア操作と高度なコレクション重複排除関数が含まれます。 5.一般的なエラーには、接続の問題、データ型の不一致、メモリオーバーフローが含まれるため、デバッグに注意する必要があります。 6.パフォーマンス最適化の提案には、適切なデータ構造の選択とメモリ排除戦略の設定が含まれます。

Redis:実際のユースケースと例Redis:実際のユースケースと例Apr 20, 2025 am 12:06 AM

現実世界でのRedisのアプリケーションには、1。キャッシュシステムとして、データベースクエリを加速し、2。Webアプリケーションのセッションデータを保存するには、3。リアルタイムランキングを実装する4。メッセージ配信をメッセージキューとして簡素化する。 Redisの汎用性と高性能により、これらのシナリオで輝きます。

Redis:その機能と機能の調査Redis:その機能と機能の調査Apr 19, 2025 am 12:04 AM

Redisは、高速、汎用性、豊富なデータ構造のために際立っています。 1)Redisは、文字列、リスト、コレクション、ハッシュなどのデータ構造をサポートし、コレクションを注文します。 2)メモリを介してデータを保存し、RDBとAOFの持続性をサポートします。 3)Redis 6.0から始めて、マルチスレッドI/O操作が導入されました。これにより、高い並行性シナリオでパフォーマンスが向上しました。

RedisはSQLまたはNOSQLデータベースですか?答えが説明しましたRedisはSQLまたはNOSQLデータベースですか?答えが説明しましたApr 18, 2025 am 12:11 AM

redisisclassifiedsaNosqldatabasebasesakey-valuedataModelinsteaded ofthetraditionaldatabasemodel.itoffersspeedand andffficability、makingidealforreal-timeaplications andcaching、butmaynotbesbesutable fors cenariois requiring datientiantientioniity

Redis:アプリケーションのパフォーマンスとスケーラビリティの向上Redis:アプリケーションのパフォーマンスとスケーラビリティの向上Apr 17, 2025 am 12:16 AM

Redisは、データをキャッシュし、分散ロックとデータの持続性を実装することにより、アプリケーションのパフォーマンスとスケーラビリティを向上させます。 1)キャッシュデータ:Redisを使用して頻繁にアクセスしたデータをキャッシュして、データアクセス速度を向上させます。 2)分散ロック:Redisを使用して分散ロックを実装して、分散環境での操作のセキュリティを確保します。 3)データの持続性:データの損失を防ぐために、RDBおよびAOFメカニズムを介してデータセキュリティを確保します。

Redis:データモデルと構造の調査Redis:データモデルと構造の調査Apr 16, 2025 am 12:09 AM

Redisのデータモデルと構造には、5つの主要なタイプが含まれます。1。文字列:テキストまたはバイナリデータの保存に使用され、原子操作をサポートします。 2。リスト:キューとスタックに適した注文された要素コレクション。 3.セット:順序付けられていない一意の要素セット、セット操作をサポートします。 4。注文セット(sortedset):ランキングに適したスコアを持つ一意の要素セット。 5。ハッシュテーブル(ハッシュ):オブジェクトの保存に適したキー価値ペアのコレクション。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール