ISUCON Go インメモリキャッシュ - HirokiYoshida837/ISUCON2022 GitHub Wiki
定義
Generics使えると思うがバージョンによるので直に書く。
type chairCacheSlice struct {
// Setが多いならsync.Mutex
sync.RWMutex
items map[int64]Chair
}
func NewChairCacheSlice() *chairCacheSlice {
m := make(map[int64]Chair)
c := &chairCacheSlice{
items: m,
}
return c
}
func (c *chairCacheSlice) Set(key int64, value Chair) {
c.Lock()
c.items[key] = value
c.Unlock()
}
func (c *chairCacheSlice) Remove(key int64) {
c.Lock()
delete(c.items, key)
c.Unlock()
}
func (c *chairCacheSlice) Get(key int64) (Chair, bool) {
c.RLock()
v, found := c.items[key]
c.RUnlock()
return v, found
}
使うとき
// グローバルで定義
var mChairCache *chairCacheSlice
// 初期化。 initialize時やアプリケーション起動時にオンメモリキャッシュも初期化すること。
mChairCache = NewChairCacheSlice()
// getするとき
cacheGet, b := mChairCache.Get(int64(id))
if b {
return c.JSON(http.StatusOK, cacheGet)
}
// setするとき
mChairCache.Set(insertChart.ID, insertChart)
// removeするとき
mChairCache.Remove(int64(id))
TODO : 複数を一気にmapに突っ込む処理を追加しておく