LoginSignup
2
1

More than 5 years have passed since last update.

ファイルのキャッシュを楽に実現するgoパッケージ

Posted at

作りました。

github

どんなパッケージ?

ディスクアクセスを減らすパッケージです。
ファイルヘッダの更新日時を確認して、最新であればファイル内容を読み取らずメモリ上の値を返す、更新されていればファイル内容を読み取って返す、といった処理をしています。

効果

自分のPCはSSDですが、それでも高速になりました。
HDDならもっと速くなる可能性があります。(HDDが手元にない><)

次に示すのは、http要求があったファイルの最新版を返す例です。

キャッシュしない場合 (約14000 [request/sec])

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // HTMLを返す
    file, err := os.Open("data/index.html")
    if err != nil {
        fmt.Fprint(w, err)
        return
    }
    io.Copy(w, file)
})

このパッケージを使った場合 (約17000 [request/sec])

// ファイルを登録
f, err := checkmodfile.RegistFile("data/index.html")
if err != nil {
    fmt.Println(err)
    return
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // HTMLを返す
    err := f.WriteTo(w)
    if err != nil {
        fmt.Fprint(w, err)
        return
    }
})

このパッケージを使うと、SSDのPCの場合で約1.2倍高速になります。
※環境やファイルサイズによります。

リクエストがあるたび*checkmodfile.Fileを動的にMapに登録するようにすれば、複数ファイルも扱えるでしょう。

興味があれば使ったり改造してみてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1