5

私は最近、Go で http 応答をキャッシュすることに夢中になっており、適切な ETag を生成するための最も効率的な方法を見つけようとしています。

現在、次のデータが利用可能です。

  1. テンプレートをレンダリングするときにレンダリングされるテンプレートの名前。
  2. json 応答のテンプレートまたは応答に渡される動的データ。
  3. 応答本文全体。
  4. 本体の長さ。
  5. 私が見逃しているかもしれない何か?

少し考えた後、テンプレートの名前と生成される動的データを組み合わせると、理論的には最小限のオーバーヘッドで正当な一意の ETag を作成する必要があるという結論に達しましたが、 30kb の html 相当のデータベース結果を返したいと思っています。

Go の stdlib の crc32 ルーチンを使用して、渡したデータから ETag を生成しています。

ETag を生成したり、動的データをキャッシュしたりするより良い方法はありますか? ファイルが変更されなくてもデータが変更される可能性があるため、ファイルの最終変更時刻を監視することはできません。

4

2 に答える 2

1

一般に、ETag として計算するのに安価なものを使用する必要があります。これは、クライアントが条件付きリクエストを送信する場合 ( If-None-MatchHTTP リクエスト ヘッダーなどを介して)、304 Not Modifiedページのすべての処理を行うことなく、レスポンスを送信することが適切かどうかを判断できるためです。

たとえば、ページのコンテンツにある種のリビジョン識別子がある場合、それは適切な ETag になる可能性があります。

ETag を生成するためだけにページをレンダリングするために必要なすべての作業を行う必要がある場合は、レンダリングされたページ コンテンツのハッシュのみを使用するか、ETag をまったく使用しないこともできます。

于 2013-02-17T14:10:07.567 に答える
0

効率的なETagメカニズムを探していて、暗号的に強力なものを必要としない場合は、CRC-32 の使用をお勧めします。衝突を防ぐために、テンプレート名、データの長さ、crc などを組み合わせることができます。

func etag(name string, data []byte) string {
    crc := crc32.ChecksumIEEE(data)
    return fmt.Sprintf(`W/"%s-%d-%08X"`, name, len(data), crc)
}

これにより、 のような etag が生成されW/"tpl-17-3074C885"ます。

于 2013-02-18T19:00:50.300 に答える