Golang 实现本地持久化缓存
// 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 实现本地持久化缓存的更多相关文章
- iOS应用架构谈 本地持久化方案及动态部署
转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...
- ssiOS应用架构谈 本地持久化方案及动态部署
本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...
- 微信小程序开发:学习笔记[9]——本地数据缓存
微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...
- 四、NOSQL之Redis持久化缓存服务基础实战第三部
1.NOSQL的理解 NOSQL是不仅仅是SQL,说的就是sql的补充,但是不能替代SQL. nosql库:memcached.memcachedb.redis 2.redis 简介 Redis是一个 ...
- IOS开发-本地持久化存储sqlite应用
前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程: 我的第一个IOS开发应用 本章主要将介 ...
- iOS - LocalCache 本地数据缓存
1.自定义方式本地数据缓存 1.1 自定义缓存 1 沙盒路径下的 Library/Caches 用来存放缓存文件,保存从网络下载的请求数据,后续仍然需要继续使用的文件,例如网络下载的离线数据,图片,视 ...
- Android清除本地数据缓存代码案例
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除shar ...
- Unity本地持久化类Playerprefs使用详解
一.PlayerPrefs是什么? PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类.工作原理十分简单,就是以key-value的形式将数据保存在本地,然后在代码中可以 ...
- 如何清除本地DNS缓存 windows
在您的网站迁移服务器时需要对域名所指向的IP进行更改,这时候在本机访问网站时就需要清除本地的DNS缓存信息,那么怎样清除呢? 首先我们应该明白清除DNS缓存信息的原理:当计算机对域名访问时并不是每次访 ...
- 刷新本地DNS缓存的方法
http://www.cnblogs.com/rubylouvre/archive/2012/08/31/2665859.html 常有人问到域名解析了不是即时生效的嘛,怎么还是原来的呢?答案就是在本 ...
随机推荐
- 编译器-FIRST集合(补充:左递归)
上一篇中实现的First函数没有考虑左递归,在这对此说明和实现 1.立即左递归 A -> Ab|a 1.两步或两步以上产生的左递归 A -> Bc|a B -> Ab|d 前面的实现 ...
- Docker安装开源版obs对象存储服务minio,并后台运行
>Minio 是一个基于Apache License v2.0开源协议的对象存储服务,虽然轻量,却拥有着不错的性能.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据. 例如 ...
- k8s pod错误的排查步骤和处理方法
查pod kubectl get pod -n amadeus -o wide 查pod日志 kubectl logs -f --timestamps -n amadeus weyo-server-6 ...
- 鼠标事件:mouseout、mouseover事件会不断触发
mouseover 和 mouseenter mouseenter不会冒泡,而mouseover会冒泡 mouseover:指针进入事件监听的元素内 或者 其他的子元素内 都会触发mouseover ...
- 【WEB前端】【报错解决】This request has been blocked; the content must be served over HTTPS.
问题描述 部署WEB项目后,开启了强制HTTPS,产生如下错误: Mixed Content: The page at 'https://ask.mllt.vip/index.php/data1.ht ...
- 创建LVM报错:Can't initialize physical volume "/dev/sdb1" of volume group "myvg" without -ff
问题: 在使用fdisk /dev/sdb 删除原有LVM分区,在接着创建LVM新分区/dev/sdb1.完毕保存之后. 执行pvcreate /dev/sdb1出现报错 Can't initiali ...
- 波折重重:Linux实时系统Xenomai宕机问题的深度定位
目录 一 前言 二 背景 三 原因分析及措施 硬件原因 应用软件 操作系统 四 分析定位 转机 拨云见雾 irq计数 Schedstat coreclk 现象结论 五 原因一 六 原因二 七 解决 八 ...
- Qt编写物联网管理平台40-类型种类
一.前言 为了增强本系统的拓展性,做成通用的物联网管理平台,特意将控制器主设备类型.探测器子设备类型.对应种类符号等信息,全部做成表格可自定义添加和修改,这样在控制器信息表和探测器信息表管理的时候,可 ...
- Qt数据库应用12-通用数据库清理
一.前言 很多项目如果需要存储很多日志记录比如运行日志,时间长了记录数量非常多,数据库体积不断增大,对应数据库表的增删改查的效率不断降低,为了消除这几个影响,需要有一套机制,不断将早期的数据清理,清理 ...
- vue3项目中报错:Unexpected mutation of "xxx" prop
vue3 中element 弹窗绑定需要通过v-model,这个时候父级会传个dialogVisible(boolean值)过来,结果会报eslint的错. Unexpected mutation o ...