在網站開發上,常常會用 快取(cache) 來提升回應時間,或者是減少對資料庫的操作等等…。 而 Go 的標準函式庫並沒有提供 cache 的實作,但是我們可以使用別人寫好的函示庫來實作 cache。

在 GitHub 上有幾個不錯的 cache 實作,例如 freecachego-cache,而今天這篇文章會以 go-cache 當作範例。

注意:此篇並不是說明 HTTP 快取

go-cache 簡介

go-cache 是 in-memory key-value pair 的 cache 機制,適合用在網站只跑在一台機器上的情況,他最大的優點是支援 執行續安全(thread-safe) 。 而且還可以將 cache 存成檔案,並且從檔案初始化 cache。

範例

使用的方式請參考下面的程式碼,有三個重點

  1. 宣告一個 package scope 的 newCache 變數 var newCache *cache.Cache
  2. 在 init() 初始化 newCache = cache.New(1*time.Minute, 20*time.Minute)
    • 第一個參數 1*time.Minute 是在指定,如果再 set cache 的時候沒有指定過期時間,會使用 1 分鐘當作預設過期時間。
    • 第二個參數 20*time.Minute 是說,每 20 分鐘會刪除過期 cache 的資料。
  3. 取得 cache 的方式也很簡單 newCache.Get("foo"),只要參考 func getFromCache 的程式碼,一看就會懂了。
    caching
    • go
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package main

    import (
    "fmt"
    "github.com/patrickmn/go-cache"
    "log"
    "net/http"
    "time"
    )

    var newCache *cache.Cache

    func init() {
    newCache = cache.New(1*time.Minute, 20*time.Minute)
    newCache.Set("foo", "miles", cache.DefaultExpiration)
    }

    func main() {
    http.HandleFunc("/", getFromCache)
    err := http.ListenAndServe("localhost:8080", nil)
    if err != nil {
    log.Fatal("error starting http server : ", err)
    return
    }
    }

    func getFromCache(w http.ResponseWriter, r *http.Request) {
    foo, found := newCache.Get("foo")
    if !found {
    newCache.Set("foo", "Bob", cache.DefaultExpiration)
    foo, _ = newCache.Get("foo")
    }
    fmt.Fprintf(w, "Hello "+foo.(string))
    }
Sample Code

延伸閱讀

[go-cache]
[go-cache doc]
[freecache]