// 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. bat隐藏窗口运行

    在bat脚本开头添加: if "%1" == "h" goto begin mshta vbscript:createobject("wscript. ...

  2. CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序

    Selenium Selenium 是一款开源且可移植的自动化软件测试工具,专门用于测试网页端应用程序或者采集网页端数据.它能够在不同的浏览器和操作系统上运行,具有很强的跨平台能力.Selenium可 ...

  3. DDPM论文解读

    DDPM(Denoising Diffusion Probabilistic Models) 论文研究背景 扩散概率模型(Denoising Diffusion Probabilistic Model ...

  4. 【Amadeus原创】wordpress批量更新图片路径的方法

    连上wordpress数据库,怼一句: UPDATE wp_posts SET post_content = REPLACE( post_content, '旧域名', '新域名' );

  5. GooseFS 统一命名空间 | 加速存储业务访问

    01 前言 ​ GooseFS是 腾讯云存储团队推出的分布式缓存方案,主要针对需要缓存加速的数据湖业务场景,提供基于对象存储COS服务的近计算端数据加速层. 统一命名空间是GooseFS提供的透明命名 ...

  6. 8.mysql表分区

    MySQL表分区 表分区是将⼀个表的数据按照⼀定的规则⽔平划分为不同的逻辑块,并分别进⾏物理存储,这个规则就叫做分区函数,可以有不同的分区规则 5.7可以通过show plugins语句查看当前MyS ...

  7. JVM实战—1.Java代码的运行原理

    大纲 1.Java代码到底是如何运行起来的 2.JVM类加载机制的一系列概念 3.JVM中有哪些内存区域及各自的作用 4.JVM的垃圾回收机制的作用 5.问题汇总 1.Java代码到底是如何运行起来的 ...

  8. 2022 年数据科学研究综述:重点介绍 ML、DL、NLP 等

    2022 年数据科学研究综述:重点介绍 ML.DL.NLP 等 当我们在 2022 年底临近时,我对许多著名研究小组完成的所有惊人工作感到振奋,他们将 AI.机器学习.深度学习和 NLP 的状态扩展到 ...

  9. Transformer总结

    Contents Attention OverallSurvey NLP Language Speech CV Backbone_Classification Self-Supervised Inte ...

  10. 外部H5唤起常用小程序链接规则整理

    概述 我目前工作是全职做小程序开发,所负责的小程序需要发布抖音+快手+微信+支付宝四端,年底了,公司准备做一波营销活动,营销活动更好传播的话首选H5活动营销页,这就需要考虑怎么把用户从H5页面引入到我 ...