您好,登錄后才能下訂單哦!
在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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。