溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實戰(zhàn)Go:HashMap緩存的緩存數(shù)據訪問日志記錄

發(fā)布時間:2024-11-09 00:29:32 來源:億速云 閱讀:78 作者:小樊 欄目:編程語言

在Go中,我們可以使用sync.Map來實現(xiàn)一個簡單的HashMap緩存。為了記錄緩存數(shù)據的訪問日志,我們可以定義一個結構體來存儲訪問日志,并在每次訪問緩存時更新日志。以下是一個示例:

package main

import (
	"fmt"
	"sync"
	"time"
)

// CacheItem 表示緩存中的一個數(shù)據項
type CacheItem struct {
	key       string
	value     interface{}
	timestamp time.Time
}

// Cache 表示一個簡單的HashMap緩存
type Cache struct {
	data      sync.Map
	accessLog []CacheItem
	mu         sync.Mutex
}

// NewCache 創(chuàng)建一個新的緩存實例
func NewCache() *Cache {
	return &Cache{}
}

// Get 從緩存中獲取數(shù)據,如果不存在則返回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 向緩存中添加數(shù)據
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用于存儲緩存數(shù)據和一個accessLog切片用于存儲訪問日志。Get方法首先嘗試從緩存中獲取數(shù)據,如果不存在則返回nil。然后,我們檢查訪問日志中最后一個條目是否與要獲取的鍵匹配。如果匹配,我們更新該條目的時間戳并將其保留在訪問日志中。如果不匹配,我們將新的緩存項添加到訪問日志中。Set方法將數(shù)據存儲在緩存中。

main函數(shù)中,我們創(chuàng)建了一個緩存實例,向其添加了兩個數(shù)據項,并從緩存中獲取了它們。最后,我們打印了訪問日志以查看緩存的訪問情況。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

go
AI