Goのオンメモリキャッシュにttlcacheをよく使っている
便利ですよね。文字通りオンメモリキャッシュにttlをつけれるってやつです。v3からはgenericsに対応しているのでアサーションも不要になりました。簡単な使い方とハマったことを紹介します。
基本的な使い方はサイトのREADMEのとおりです。
cache := ttlcache.New[string, string](
ttlcache.WithTTL[string, string](30 * time.Minute),
)
go cache.Start()
気をつけるポイントとしては go cache.Start()
を実行しておかないとexpiredしたアイテムを自動で削除する処理が走りません。
便利な使い方で僕がよく利用するのは、OnEviction
フックです。これはキャッシュが失効したときに呼び出されるコールバックで、キャッシュデータの更新に利用しています。
cache.OnEviction(func(ctx context.Context, reason ttlcache.EvictionReason, item *ttlcache.Item[string, string]) {
newValue := doSomething(item.Key())
cache.Set(item.Key(), newValue, ttlcache.DefaultTTL)
})
こうすることで、非同期にキャッシュを更新しつつ、オンライン処理を高速に実装することができます。
ハマった内容としては、キャッシュがいつまでも失効しないので、なにか不具合か?と思っていたのですが、ttlcacheではキャッシュにヒットしたときにttlを延長するという実装が入っています。
https://github.com/jellydator/ttlcache/blob/6c6fce49fcd399ef4bb1f0b6cc14aee7c09ed4cf/cache.go#L188
これを向こうにしたければこのようにオプションを付けるといいです。
cache := ttlcache.New[string, string](
ttlcache.WithTTL[string, string](30 * time.Minute),
ttlcache.WithDisableTouchOnHit[string, string](),
)
僕はv2から利用していて、v3になってからだいぶ便利に思う反面、同じノリで利用しているとハマることがあるので、気をつけてください。