// Copyright (c) 2024 LiuShuKu
// Project Name : balance
// Author : liushuku@yeah.net package cache import (
"encoding/json"
"log"
"os"
"strconv"
"sync"
) // Cache 结构体定义
type Cache struct {
data map[string]string
mutex sync.RWMutex
file string
dirtyFlag bool // 标记数据是否已更改
} // NewCache 创建新的 Cache 实例
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
} // Get 从缓存中获取值
func (c *Cache) Get(key string) string {
c.mutex.RLock()
defer c.mutex.RUnlock()
value, _ := c.data[key]
return value
} // Increment 自增接口
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()
} // Set 将值存入缓存
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()
} // Save 持久化缓存到文件
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
} // Load 从文件加载缓存
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
} // saveIfDirty 如果数据已更改,则保存到文件
func (c *Cache) saveIfDirty() {
if c.dirtyFlag {
if err := c.save(); err == nil {
c.dirtyFlag = false // 保存成功后重置脏标记
}
}
}

Golang 实现本地持久化缓存的更多相关文章

  1. iOS应用架构谈 本地持久化方案及动态部署

    转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...

  2. ssiOS应用架构谈 本地持久化方案及动态部署

    本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

  3. 微信小程序开发:学习笔记[9]——本地数据缓存

    微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...

  4. 四、NOSQL之Redis持久化缓存服务基础实战第三部

    1.NOSQL的理解 NOSQL是不仅仅是SQL,说的就是sql的补充,但是不能替代SQL. nosql库:memcached.memcachedb.redis 2.redis 简介 Redis是一个 ...

  5. IOS开发-本地持久化存储sqlite应用

    前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程:                     我的第一个IOS开发应用    本章主要将介 ...

  6. iOS - LocalCache 本地数据缓存

    1.自定义方式本地数据缓存 1.1 自定义缓存 1 沙盒路径下的 Library/Caches 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视 ...

  7. Android清除本地数据缓存代码案例

    Android清除本地数据缓存代码案例 直接上代码: /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除shar ...

  8. Unity本地持久化类Playerprefs使用详解

    一.PlayerPrefs是什么? PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类.工作原理十分简单,就是以key-value的形式将数据保存在本地,然后在代码中可以 ...

  9. 如何清除本地DNS缓存 windows

    在您的网站迁移服务器时需要对域名所指向的IP进行更改,这时候在本机访问网站时就需要清除本地的DNS缓存信息,那么怎样清除呢? 首先我们应该明白清除DNS缓存信息的原理:当计算机对域名访问时并不是每次访 ...

  10. 刷新本地DNS缓存的方法

    http://www.cnblogs.com/rubylouvre/archive/2012/08/31/2665859.html 常有人问到域名解析了不是即时生效的嘛,怎么还是原来的呢?答案就是在本 ...

随机推荐

  1. \r,\n,\r\n的前世今生

    前情 最近在逛论坛的时候遇到有人在提问题,为什么\n在苹果手机上不换行,我以前有网上看到过文章,是因为各系统的解析不同,需要使用\r\n来做兼容,自己虽然知道怎么解决,但是不知具体原因,今特来详细了解 ...

  2. 渗透测试-前端验签绕过之SHA256

    本文是高级前端加解密与验签实战的第1篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过SHA256签名来爆破登录. 绕过 通过查看源代码可以看到key为 123412 ...

  3. idea左上角project一片绿的解决方法

    idea突然project底色一片绿,真的心里慌得一批.. 解决方法: 打开File-Settings,按图示找到地方,关闭FileColor,即可.

  4. Sealos Devbox 基础教程:使用 Cursor 从零开发一个代码猜古诗小游戏

    给你一段代码,让你根据代码来猜对应的古诗词,你能猜对吗? 这不是玩笑,还真有人这么干 这是一张在 1024 程序员节流传的代码猜诗句小游戏,相信很多程序员小朋友都看到过. 今天我们将用魔法打败魔法,通 ...

  5. 龙哥量化:通达信财富币不够怎么办:K线训练营100%胜率,赚财富币

    通达信app的K线训练营中,[K线训练]和[K线对战]都需要花费[5财富币]进行训练,[K线对战]胜利的话可以获得10财富币.注意:是对战,对战,对战,那怎么才能每场都胜呢,哈哈,我们找到历史K线,对 ...

  6. Qt/C++地图动态绘制折线多边形矩形圆形标注点/可编辑拖动调整大小和位置

    一.前言说明 无论哪一家的地图,都提供了调用函数绘制各种覆盖物,但是有时候的场景是希望进入添加覆盖物模式,然后每次在地图上按下都自动生成对应的覆盖物比如圆形,这样就不需要用户提前知道经纬度坐标等参数, ...

  7. .NET 9 new features-Memory Caching 和 Collections 优化

    一.内存缓存(Memory Caching) 1. 具体的原理 内存缓存是一种在应用程序内存中存储数据的机制,旨在减少对外部数据源的频繁访问,从而提高应用程序的性能. 在 .NET 中,MemoryC ...

  8. ffmpeg实现视频的合成与分割

    视频合成与分割程序使用   作者开发了一款软件,可以实现对视频的合成和分割,界面如下: 下载该程序 播放时,可以选择多个视频源:在选中"保存视频"情况下,会将多个视频源合成一个视频 ...

  9. G1原理—3.G1是如何提升垃圾回收效率

    大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7. ...

  10. c# 多线程 lock

    模拟10个线程,每个线程模拟100次取钱: 其实就是相当于1000个人来同时取钱.当然实际情况是取钱的人分布在不同的地区的取款机取钱.同一个取款机只能一个人操作. 关键是要保证取钱的余额要准确,不能在 ...