golang cacheMap

作者:
淡白
创建时间:
2020-12-12 20:30:04
Go

摘要:本文介绍了一个简单的缓存实现方法,通过使用Map来存储缓存数据,并利用sync.Mutex实现并发安全。其中缓存数据包含一个值和过期时间,可以通过SetCache方法设置缓存并指定过期时间,通过GetCache方法获取缓存值,通过Remove方法移除缓存。示例代码展示了如何使用该缓存库,先设置一个缓存值为"cache"并设置过期时间为10秒,然后获取并打印该缓存值。

缓存

为了缓解一些接口的压力(数据还重复计算和数据量大),又没有redis就用Map写了个简单的做缓存.

package utils

import (
	"sync"
	"time"
)
var Cache cacheMap
func init()  {
	go Cache.iniCache()
}
type cacheMap struct {
	cacheMap  map[string]cacheVal
	cacheLock sync.Mutex
}
type cacheVal struct {
	val     interface{}
	outTime time.Time
}
func (this *cacheMap) iniCache() {
	this.cacheMap = make(map[string]cacheVal)
	for {
		time.Sleep(time.Second)
		this.cacheLock.Lock()
		for k, val := range this.cacheMap {
			if val.outTime.Sub(time.Now()).Microseconds() < 0 {
				delete(this.cacheMap, k)
			}
		}
		this.cacheLock.Unlock()
	}
}
func (this *cacheMap) GetCache(key string) interface{} {
	this.cacheLock.Lock()
	defer this.cacheLock.Unlock()
	return this.cacheMap[key].val
}
func (this *cacheMap) Remove(key string){
	this.cacheLock.Lock()
	defer this.cacheLock.Unlock()
	delete(this.cacheMap,key)
}

func (this *cacheMap) SetCache(key string, val interface{}, Time time.Duration) {
	this.cacheLock.Lock()
	defer this.cacheLock.Unlock()
	cacheVal := cacheVal{
		val:     val,
		outTime: time.Now().Add(Time),
	}
	this.cacheMap[key] = cacheVal
}

使用

func main() {
	utils.Cache.SetCache("test","cache",time.Second*10)
	println(utils.Cache.GetCache("test").(string))
}