🗃️

go/ginでキャッシュするテスツ

2022/02/06に公開

いろんなところからRSSフィードを取りまくっていたら、毎度取得しにいって、他サイト多サイト多彩にアクセスしにいって、表示は遅いわ他者に迷惑かけるわで失礼極まりないWebサイツの出来上がりです。このまま生き恥晒していていかがなものか。そう自問自答する日々でした。

cacheを使おう

そうです。大抵どの言語でもキャッシュとあわせて検索すればきっと便利なパッケージが僕らを待っている。で、ググってみました「go gin cache」と。すると、たぶん1個か2個しかない。go langの勢いが弱いのか、ginが弱いのか。もしくはこのパッケージが神がかっているのか。

https://github.com/gin-contrib/cache

なんか説明がめっちゃ短い。できればローカルストレージとか、メムキャッシュ的な、テキストを保存してくれて、名前をこっちで決められる柔軟性をもとめていたが、そんなものではないらしい。でもginフレームワークにとって導入はどちゃくそ楽だった。だからみてほしい。

main.go
router.GET("/", func(c *gin.Context) {
	...
	c.HTML(200, "index", gin.H{
		"title": "ドコカデホームページ",
		...
	})
})

こうトップページとか書くと思うんですが。以下のような感じにします。

main.go
import (
	....
+	"time"
+	"github.com/gin-contrib/cache"
+	"github.com/gin-contrib/cache/persistence"
)

func main() {
	...
+	//cache
+	store := persistence.NewInMemoryStore(3600 * time.Second)

-	router.GET("/", func(c *gin.Context) {
+	router.GET("/", cache.CachePage(store, 3600 * time.Minute, func(c *gin.Context) {
		...
-	})
+	}))

わかりますかね?zennはdiffっぽいの気軽に書けるのがいいですね(脱線)
router.GETを書き換えて、閉じカッコが一個増えます。
これをするだけでキャッシュされて、これまで2秒くらい掛かってたページがマイクロ秒表示になりました!

ちゃんとソースを追いかけてないんですが、CachePageの第2引数がexpireで、storeはメムキャッシュのラップでpersistenceという名前にしてるのが、ちょっとソース解析する人には分かりにくようです。

// 1分後
1 * time.Minute
// 1時間後
1 * time.Hour
// 1日後
24 * time.Hour

時間はこんな感じで指定の仕方があります。

もっと普通にメムりたい人はこっちですね。
https://github.com/robfig/go-cache

Discussion