温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

实战Go:HashMap缓存的缓存数据访问日志记录

发布时间:2024-11-09 00:29:32 来源:亿速云 阅读:78 作者:小樊 栏目:编程语言

在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函数中,我们创建了一个缓存实例,向其添加了两个数据项,并从缓存中获取了它们。最后,我们打印了访问日志以查看缓存的访问情况。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go
AI