golang一个轻量级基于内存的kv存储或缓存

server/2024/10/20 13:33:34/

golangkv_0">golang一个轻量级基于内存的kv存储或缓存

go-cache是一个轻量级的基于内存的key:value 储存组件,类似于memcached,适用于在单机上运行的应用程序。
它的主要优点是,本质上是一个具有过期时间的线程安全map[string]interface{}。interface的结构决定了它不需要序列化。基于内存的特性决定了其不需要网络传输其内容,因此就不存在网络耗时。

在使用时,一般都是将go-cache作为数据缓存来使用,而不是持久性的数据存储。对于停机后快速恢复的场景,go-cache支持将缓存数据保存到文件,恢复时从文件中load数据加载到内存。

go-cache广泛使用在go语言编程中,适合在单机上存储键值对形式的内存缓存

github上地址为: https://github.com/patrickmn/go-cache

它在并发的时候,线程安全(读写锁) + map[string]interface{} + 过期时间 来作为go的本地化存储。

这也是他的三大特性:

  • 线程安全,通过读写锁支持多个协程并发访问
  • 不需要序列化,键值对形式,任意值类型map[string]interface{}
  • 自定义每个key的过期时间

cache基本使用

安装go-cache

go get github.com/patrickmn/go-cache

创建一个go文件,例如:cache_demo.go 内容如下

package mainimport ("fmt""github.com/patrickmn/go-cache""time"
)func main() {// 初始化cache 默认过期时间设置为5*time.Minute,扫描过期key的间隔时间10*time.Minutec := cache.New(5*time.Minute, 10*time.Minute)// 设置为默认过期时间,即New时设置的时间5*time.Minutec.Set("foo", "bar", cache.DefaultExpiration)// 设置为不过期c.Set("baz", 42, cache.NoExpiration)// 设置指定过期时间为100秒c.Set("cache", 100, time.Second*3)// Get the string associated with the key "foo" from the cachefoo, found := c.Get("foo")if found {fmt.Println(foo)}// 验证过期<-time.After(5 * time.Second)cacheRes, found := c.Get("cache")if found {fmt.Println(cacheRes)} else {fmt.Println("cache not found")}// 因为value是interface{}类型,所以如果需要存入的类型,需要断言var fooValue stringif x, ok := c.Get("foo"); ok {fooValue = x.(string)}fmt.Println("fooValue:", fooValue)//对于结构体,存储一个指针,可以有一个更好的性能c.Set("MyStruct", &MyStruct{Name: "gary",Age:  18,}, cache.DefaultExpiration)if x, ok := c.Get("MyStruct"); ok {res := x.(*MyStruct)fmt.Println("MyStruct:", res)}// 删除keyc.Delete("foo")if fooRes, ok := c.Get("foo"); ok {fmt.Println("after delete", fooRes)} else {fmt.Println("after delete not found foo")}
}type MyStruct struct {Name stringAge  int
}

cache封装

项目中定义一个cache包,所有缓存方法封装到cache包里,外部直接调用

package cacheimport ("github.com/patrickmn/go-cache""time"
)var c *cache.Cachefunc init() {//创建一个默认过期时间为5分钟的缓存,并且//每10分钟清除一次过期项目c = cache.New(5*time.Minute, 10*time.Minute)
}// 缓存保存 默认的过期时间
func SetDefaultExpire(key string, value interface{}) {c.Set(key, value, cache.DefaultExpiration)
}// 缓存放入 不过期
func SetNoExpire(key string, value interface{}) {c.Set(key, value, cache.NoExpiration)
}// 缓存放入 设置过期时间
func SetExpire(key string, value interface{}, t time.Duration) {c.Set(key, value, t)
}// 缓存获取
func Get(key string) (interface{}, bool) {return c.Get(key)
}// 删除缓存
func Delete(key string) {c.Delete(key)
}

参考链接:
https://github.com/patrickmn/go-cache
https://www.jianshu.com/p/1ba4d429d3d3
https://www.cnblogs.com/Moon-Light-Dream/p/12494683.html


http://www.ppmy.cn/server/133349.html

相关文章

分布式搜索引擎03

0.学习目标 1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快…

【PyTorch 】【CUDA】深入了解 PyTorch 中的 CUDA 和 cuDNN 版本及 GPU 信息

目录 引言一、环境准备1.1 重要的环境依赖1.2 安装 CUDA 和 cuDNN1.3 示例安装步骤1.4 PyTorch、CUDA 和 cuDNN 版本兼容性表 二、检查 CUDA 和 cuDNN 版本三、检查 GPU 可用性四、测试 PyTorch 是否正常工作五、PyTorch 中的 GPU 工作流程五、常见问题解答5.1 如何更新 CUDA 和…

阿里云linux系统扩容分区

系统扩容需要进行三步操作&#xff1a;①服务器扩容云盘 ② 扩容分区 ③ 扩容文件系统 参考&#xff1a;https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spma2c4g.11186623.0.0.6a094862DCMnnM#de3365e1d4l…

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

C++学习笔记----9、发现继承的技巧(三)---- 尊重父类(2)

4、指向父类名字 当在继承类中重载一个成员函数时&#xff0c;只要与其它代码相关就要有效替换掉原有的代码。然而&#xff0c;成员函数的父版本仍然存在&#xff0c;你可能会想使用它。例如&#xff0c;一个重载的成员函数会保持基类实现的行为&#xff0c;加上其它的一些。看…

HTB:Return[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap扫描靶机开放端口 将靶机开放端口进行脚本、服务扫描 使用浏览器访问靶机80端口并进入Setting选项 将其修改为本地IP&#xff0c;并在本地侧开启nc监听389端口 查看user_flag内容 USER_FLAG&#xff1a;de9d4982df48629d7457ef2…

【每日一题】【算法双周赛】【第 20 场 小白入门赛评价/分享】赛后另类AI写题分析分享

第 20 场 小白入门赛 1. 四个亲戚【算法赛】2. 黛玉泡茶【算法赛】AI分析具体实现代码解析复杂度分析示例运行 结果二 3. 宝玉请安【算法赛】AI分析问题分析路径计算代码实现代码解析示例运行复杂度分析 结果&#xff1a; 交上去 4. 贾母祝寿【算法赛】AI分析问题分析实现步骤代…

git gui基本使用

一、图形化界面 二、创建新项目 创建文件&#xff0c;加入暂存区&#xff0c;提交到版本库 三、创建分支 四、合并分支 1.切换至master 五、更新分支 六、解决冲突 修改冲突&#xff0c;加入暂存区&#xff0c;提交到版本库 七、远程创建库 Gitee - 基于 Git 的代码托管和研…