| |
| |
| |
| |
| package cache |
| |
| import ( |
| "encoding/json" |
| "log" |
| "os" |
| "strconv" |
| "sync" |
| ) |
| |
| |
| type Cache struct { |
| data map[string]string |
| mutex sync.RWMutex |
| file string |
| dirtyFlag bool |
| } |
| |
| |
| func NewCache(file string) *Cache { |
| cache := &Cache{ |
| data: make(map[string]string), |
| file: file, |
| } |
| if err := cache.load(); err != nil { |
| log.Printf("加载缓存时出错: %v", err) |
| } |
| return cache |
| } |
| |
| |
| func (c *Cache) Get(key string) string { |
| c.mutex.RLock() |
| defer c.mutex.RUnlock() |
| value, _ := c.data[key] |
| return value |
| } |
| |
| |
| func (c *Cache) Increment(key string) { |
| c.mutex.Lock() |
| defer c.mutex.Unlock() |
| currentValue, found := c.data[key] |
| var newValue int |
| if found { |
| currentInt, err := strconv.Atoi(currentValue) |
| if err != nil { |
| newValue = 1 |
| } else { |
| newValue = currentInt + 1 |
| } |
| } else { |
| newValue = 1 |
| } |
| c.data[key] = strconv.Itoa(newValue) |
| c.dirtyFlag = true |
| c.saveIfDirty() |
| } |
| |
| |
| func (c *Cache) Set(key, value string) { |
| c.mutex.Lock() |
| defer c.mutex.Unlock() |
| if c.data[key] != value { |
| c.data[key] = value |
| c.dirtyFlag = true |
| } |
| c.saveIfDirty() |
| } |
| |
| |
| func (c *Cache) save() error { |
| fileData, err := json.MarshalIndent(c.data, "", " ") |
| if err != nil { |
| log.Printf("序列化数据时出错: %v", err) |
| return err |
| } |
| if err := os.WriteFile(c.file, fileData, 0644); err != nil { |
| log.Printf("写入文件时出错: %v", err) |
| return err |
| } |
| return nil |
| } |
| |
| |
| func (c *Cache) load() error { |
| fileData, err := os.ReadFile(c.file) |
| if err != nil { |
| if !os.IsNotExist(err) { |
| log.Printf("读取文件时出错: %v", err) |
| } |
| return err |
| } |
| if err := json.Unmarshal(fileData, &c.data); err != nil { |
| log.Printf("解析 JSON 时出错: %v", err) |
| return err |
| } |
| return nil |
| } |
| |
| |
| func (c *Cache) saveIfDirty() { |
| if c.dirtyFlag { |
| if err := c.save(); err == nil { |
| c.dirtyFlag = false |
| } |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了