在Go中,我们可以使用sync.Map
来实现一个简单的HashMap缓存。为了记录缓存数据的访问日志,我们可以定义一个结构体来存储访问日志,并在每次访问缓存时更新日志。以下是一个示例:
package main
import (
"fmt"
"sync"
"time"
)
// CacheItem 表示缓存中的一个数据项
type CacheItem struct {
key string
value interface{}
timestamp time.Time
}
// Cache 表示一个简单的HashMap缓存
type Cache struct {
data sync.Map
accessLog []CacheItem
mu sync.Mutex
}
// NewCache 创建一个新的缓存实例
func NewCache() *Cache {
return &Cache{}
}
// Get 从缓存中获取数据,如果不存在则返回nil
func (c *Cache) Get(key string) interface{} {
value, ok := c.data.Load(key)
if !ok {
return nil
}
c.mu.Lock()
defer c.mu.Unlock()
item, exists := c.accessLog[len(c.accessLog)-1]
if exists && item.key == key {
item.timestamp = time.Now()
c.accessLog[len(c.accessLog)-1] = item
return value
}
c.accessLog = append(c.accessLog, CacheItem{key: key, timestamp: time.Now()})
return value
}
// Set 向缓存中添加数据
func (c *Cache) Set(key string, value interface{}) {
c.data.Store(key, value)
}
func main() {
cache := NewCache()
cache.Set("key1", "value1")
cache.Set("key2", "value2")
fmt.Println(cache.Get("key1")) // 输出:value1
fmt.Println(cache.Get("key2")) // 输出:value2
fmt.Println(cache.Get("key3")) // 输出:nil
fmt.Println("Access log:")
for _, item := range cache.accessLog {
fmt.Printf("Key: %s, Value: %v, Timestamp: %v\n", item.key, item.value, item.timestamp)
}
}
在这个示例中,我们定义了一个CacheItem
结构体来存储缓存项的键、值和时间戳。我们还定义了一个Cache
结构体,其中包含一个sync.Map
用于存储缓存数据和一个accessLog
切片用于存储访问日志。Get
方法首先尝试从缓存中获取数据,如果不存在则返回nil。然后,我们检查访问日志中最后一个条目是否与要获取的键匹配。如果匹配,我们更新该条目的时间戳并将其保留在访问日志中。如果不匹配,我们将新的缓存项添加到访问日志中。Set
方法将数据存储在缓存中。
在main
函数中,我们创建了一个缓存实例,向其添加了两个数据项,并从缓存中获取了它们。最后,我们打印了访问日志以查看缓存的访问情况。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。