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に突っ込む処理を追加しておく