基于sync.map实现的一套并发读写安全的本地cache

使用map来做本地并发读写控制,就跟身上背着一把大锁一样难受。基于sync.map实现的并发读写安全的本地cache可以让使用和理解更加简单。

压测结果如下

goos: darwin
goarch: amd64
pkg: git.ddxq.mobi/ddmc-golang/risk/pkg/localcache
BenchmarkNewCache-8             1000000000           0.878 ns/op           0 B/op          0 allocs/op
BenchmarkCache_Set-8            13497774            90.0 ns/op        32 B/op          2 allocs/op
BenchmarkCache_Get-8            59204916            20.0 ns/op         0 B/op          0 allocs/op
BenchmarkCache_GetOrSet-8       25517443            45.2 ns/op        16 B/op          1 allocs/op
BenchmarkCache_IsExist-8        61711795            20.9 ns/op         0 B/op          0 allocs/op
BenchmarkCache_Size-8            2189498           635 ns/op           0 B/op          0 allocs/op
PASS
package localcache

import (
    "sync"
)

// go原生支持的sync.map并发读写安全的内存缓存
type Cache struct {
    m sync.Map
}

func NewCache() *Cache {
    return &Cache{}
}

func (c *Cache) Set(key string, val interface{}) {
    c.m.Store(key, val)
}

func (c *Cache) Get(key string) interface{} {
    if val, ok := c.m.Load(key); ok {
        return val
    }
    return nil
}

// 如果不存在,就设置,并且返回设置的值
func (c *Cache) GetOrSet(key string, val interface{}) interface{} {
    if ac, ok := c.m.LoadOrStore(key, val); ok {
        return ac
    }
    return val
}

func (c *Cache) Delete(key string) {
    c.m.Delete(key)
}

func (c *Cache) IsExist(key string) bool {
    _, ok := c.m.Load(key)
    return ok
}

func (c *Cache) Size() (len int) {
    c.m.Range(func(key, value interface{}) bool {
        len++
        return true
    })
    return len
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论审核已启用。您的评论可能需要一段时间后才能被显示。