[Go] Implementing caching in Go
在網站開發上,常常會用 快取(cache) 來提升回應時間,或者是減少對資料庫的操作等等…。 而 Go 的標準函式庫並沒有提供 cache 的實作,但是我們可以使用別人寫好的函示庫來實作 cache。
在 GitHub 上有幾個不錯的 cache 實作,例如 freecache 和 go-cache,而今天這篇文章會以 go-cache 當作範例。
注意:此篇並不是說明 HTTP 快取
go-cache 簡介
go-cache 是 in-memory key-value pair 的 cache 機制,適合用在網站只跑在一台機器上的情況,他最大的優點是支援 執行續安全(thread-safe) 。 而且還可以將 cache 存成檔案,並且從檔案初始化 cache。
範例
使用的方式請參考下面的程式碼,有三個重點
- 宣告一個 package scope 的 newCache 變數
var newCache *cache.Cache
- 在 init() 初始化
newCache = cache.New(1*time.Minute, 20*time.Minute)
- 第一個參數
1*time.Minute
是在指定,如果再set cache
的時候沒有指定過期時間,會使用 1 分鐘當作預設過期時間。 - 第二個參數
20*time.Minute
是說,每 20 分鐘會刪除過期 cache 的資料。
- 第一個參數
- 取得 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
34package 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))
}