4

私はAJAXとキャッシングのアイデアに慣れていません。

AJAX - W3Schools からサーバーにリクエストを送信する"?t=" + Math.random()、キャッシュを防ぐために実行するスクリプトの URL の末尾に追加する必要があると書かれています。

ウィキペディアでは、「キャッシュ」の簡単な定義は次のとおりです。

コンピューター サイエンスでは、キャッシュはデータを透過的に格納するコンポーネントであり、そのデータに対する今後の要求をより迅速に処理できるようにします。キャッシュ内に格納されているデータは、以前に計算された値であるか、別の場所に格納されている元の値の複製である可能性があります。

でも、これでいいのではないですか?コンピューターに既に重複データが保存されている場合、スクリプトはより高速に実行されます。また、チュートリアル ページの最初の例は、URL を追加しなくても問題なく動作しました。

を使用する理由を教えてください"?t=" + Math.random()

4

3 に答える 3

7

でも、これでいいのではないですか?

はい、パフォーマンス上の理由からキャッシュ システムを使用することをお勧めします。一度読み込まれた要素は、毎回サーバーに HTTP リクエストを行うことなく取得されるため、アプリケーション ページはすばやく読み込まれます。

"?t=" + Math.random() を使用する理由を教えてください。

これを追加すること"?t=" + Math.random()は、スクリプトをリロードするたびにスクリプトの URL の名前を変更するようなものです。キャッシュシステムは、実際には何も変わっていなくても、すでに保存されている古い要素ではなく、新しい要素として認識します。したがって、サーバーから要素を強制的にリロードします。

一般に、頻繁に更新される要素 (画像、スクリプトなど) でそれを行いたい場合があります。たとえば、ユーザーが変更できる Web サイトのプロフィール写真の場合です。古い写真ファイルがキャッシュにある場合、乱数のトリックを使用しないと、新しい写真がすぐに表示されることはありません。 . ユーザーは、自分のアップロードがうまくいかなかったと思うかもしれません。彼はブラウザでキャッシュを手動で空にする必要があり、これは必ずしも直感的ではありません。

2 番目の理由は、コードの変更が考慮される分ごとにキャッシュを空にする必要がないため、開発中に行うのが良いということです...

ただし、このトリックは、変更されない、またはほとんど変更されないことが確実な要素には使用しないでください。

于 2013-10-30T23:57:25.830 に答える
1

このような Web サービス リクエストの最後にランダムな要素を追加する理由は、多くの場合、データを常に最新の状態にしたいからです。キャッシュしている場合、データが最新でない可能性があります。

たとえば、ゲームの現在のハイスコアを取得する AJAX リクエストがあるとします。で呼び出しますhttp://example.com/get_high_score.php。返すと言う100。ここで、5 秒待ってからこれを再度呼び出す (またはユーザーがページを更新する) とします。そのリクエストがキャッシュされていた場合、100再度返される可能性があります。ただし、その時点で、スコアは実際には になっている可能性があります125

を呼び出すhttp://example.com/get_high_score.php?t=12345786と、スコアはキャッシュされていないため、最新の値になります。

url + "?t=" + Math.random()これを行うための 1 つの手段にすぎません。タイムスタンプは常に一意であることが保証されているため、実際には代わりにタイムスタンプを使用することを好みます。

url + "?t=" + (new Date()).getTime()

反対に、データを常に最新の状態にしておく必要がない場合 (たとえば、ほとんど変更されないメニュー項目オプションのリストを送信するだけの場合) は、キャッシュは問題なく、余分なものは省略した方がよいでしょう。少し。

于 2013-10-30T23:54:02.193 に答える
0

別の方法は、タイムスタンプを使用するか、数秒ごとに変更されるように設計することです。最善の方法は (可能な場合)、サーバー応答のヘッダーにエントリを追加して、ブラウザーに結果をキャッシュしないように指示することです。

var t = new Date().getTime(); var t2 = Math.floor(t/10000); url = target_url + "?t=" + t2;

この場合はありそうにありませんが、サーバー側のコードなどを通じてランダムな内部 URL へのリンクをサイトが継続的に生成する場合、それは「スパイダー トラップ」になり、検索エンジンなどのクローラーがこれらのランダムなリンクをたどってループに陥ることに注意してください。サーバー負荷のピークを引き起こします。

于 2014-06-10T20:25:32.293 に答える