在Go语言中,使用sync.Map
可以实现线程安全的HashMap缓存。但是,sync.Map
并不支持过期时间和数据删除操作。为了解决这个问题,我们可以使用第三方库,如groupcache
或bigcache
。
下面是一个使用groupcache
库实现的HashMap缓存示例:
groupcache
库:go get github.com/golang/groupcache
Cache
结构体,用于存储缓存数据:package main
import (
"fmt"
"github.com/golang/groupcache"
"sync"
"time"
)
type Cache struct {
mu sync.RWMutex
items map[string]*groupcache.SingleFlightGroupValue
}
func NewCache() *Cache {
return &Cache{
items: make(map[string]*groupcache.SingleFlightGroupValue),
}
}
Get
方法,从缓存中获取数据:func (c *Cache) Get(key string, fetchFunc func() (interface{}, error)) (interface{}, error) {
c.mu.RLock()
group, _ := c.items[key]
c.mu.RUnlock()
if group == nil {
c.mu.Lock()
group, _ = c.items[key]
if group == nil {
group = groupcache.NewGroupValue(key, fetchFunc)
c.items[key] = group
}
c.mu.Unlock()
}
value, err := group.Get()
if err != nil {
return nil, err
}
return value, nil
}
Set
方法,将数据存储到缓存中:func (c *Cache) Set(key string, value interface{}, ttl time.Duration) {
c.mu.Lock()
defer c.mu.Unlock()
group := groupcache.NewGroupValue(key, func() (interface{}, error) {
return value, nil
})
group.Set(value, ttl)
c.items[key] = group
}
Delete
方法,从缓存中删除数据:func (c *Cache) Delete(key string) {
c.mu.Lock()
defer c.mu.Unlock()
delete(c.items, key)
}
func main() {
cache := NewCache()
// 设置缓存数据
cache.Set("key1", "value1", 5*time.Minute)
cache.Set("key2", "value2", 10*time.Minute)
// 获取缓存数据
value1, _ := cache.Get("key1")
fmt.Println("key1:", value1)
value2, _ := cache.Get("key2")
fmt.Println("key2:", value2)
// 删除缓存数据
cache.Delete("key1")
// 再次获取缓存数据
value1, _ = cache.Get("key1")
fmt.Println("key1 after deletion:", value1)
}
这个示例展示了如何使用groupcache
库实现一个支持过期时间和数据删除操作的HashMap缓存。你可以根据实际需求对这个示例进行修改和扩展。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。