// 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. Microsoft Build 2022 专家对话

    Microsoft Build 2022 专家对话 Build 2022 专家对话地址:https://mybuild.microsoft.com/en-US/sessions/81056450-6f ...

  2. 【Linux】CentOS7 远程联机

    # CentOS7 远程联机 哔哩哔哩 萌狼蓝天 博客:https://mllt.cc 微信公众号:萌狼蓝天 检查与安装配置OpenSSH [CentOS7]检查系统是否安装OpenSSH yum - ...

  3. B站千万级长连接实时消息系统的架构设计与实践

    本文由哔哩哔哩资深开发工程师黄山成分享,原题"千万长连消息系统",本文进行了排版和内容优化等. 1.引言 在当今数字娱乐时代,弹幕已经成为直播平台上不可或缺的互动元素之一. 用户通 ...

  4. 最新AI智能体开发案例:Coze工作流必备神器!教你用Coze平台搭建「扣子工作流生成神器」智能体!

    点击 疯狂老包  > 点击右上角"···" > 关注我 各位小伙伴们,大家好呀!我是疯狂老包.我精心打造的<疯狂AI智能体开发:100个实战案例, 从 入门到精通 ...

  5. SpringBoot整合Netty+WebSocket

    SpringBoot整合Netty+WebSocket 构建环境 pom.xml <?xml version="1.0" encoding="UTF-8" ...

  6. Spring源码分析基本介绍

    Spring源码分析(一)基本介绍   摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 前言 作为一名开发人员,阅读源码 ...

  7. 京东从 OpenStack 改用 Kubernetes 的始末

    构建集群的历史 物理机器的时代(2004年-2014年) 在2014年之前,我们公司的应用程序都部署在物理机器上.在物理机器时代,为了给即将上线的应用程序分配物理机器,我们平均需要等上一周的时间.由于 ...

  8. smart_web 管理端基本说明

    smart_web 操作手册 1. smart_web 是什么? smart_web 是 smart_rtmpd 的付费版本,拥有比免费版本更多的功能支持,基于 web 的管理方式,让您随时随地在大部 ...

  9. LESLIE NOTE ——你的笔记只属于你自己

    LESLIE NOTE 网站:http://www.leslienote.com 简介: [只有数据可控,才是最放心的] [只有多多备份,才是最安全的] LESLIE NOTE 是一款本地笔记软件, ...

  10. 大语言模型(LLMs)隐私保护技术综述学习

    链接:https://mp.weixin.qq.com/s/PCVHPxCwuciTR2BQCsAl4Q 原文:https://arxiv.org/abs/2408.05212