GoFrame框架gcache的缓存控制淘汰策略实践示例
作者:王中阳Go 发布时间:2023-07-22 06:41:19
标签:GoFrame,gcache,缓存控制,淘汰策略
基本概念
gcache
模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU
性能损耗在ns
纳秒级别。使用简单易上手,非常适合单机应用使用。
基本使用
我们可以通过gcache.New()
创建一个缓存对象
也可以直接使用gcache包方法,使用方式都是一样的。
下面代码段介绍了gcache的基本使用:
package main
import (
"fmt"
"github.com/gogf/gf/os/gcache"
"github.com/gogf/gf/os/gtime"
)
func main() {
// 创建一个缓存对象,
c := gcache.New()
// 设置缓存,不过期
_ = c.Set("k1", "v1", 0)
// 获取缓存
v, _ := c.Get("k1")
fmt.Println("k1对应的值:", v) //v1
// 获取缓存大小
n, _ := c.Size()
fmt.Println("缓存大小:", n) //1
// 缓存中是否存在指定键名
b, _ := c.Contains("k1")
fmt.Println("是否存在k1:", b) //true
isContains, _ := c.Contains("k2") //false
fmt.Println("是否存在k2:", isContains)
// 删除并返回被删除的键值
fmt.Println(c.Remove("k1")) //v1
// 关闭缓存对象,让GC回收资源
_ = c.Close()
// 当然也可以便捷地直接使用gcache包方法,使用方式和上面的一样
_ = gcache.Set("k2", "v2", gtime.M*30) //半小时后到期
k2Value, _ := gcache.Get("k2")
fmt.Println("k2对应的值:", k2Value) //v2
}
打印结果
缓存控制
下面介绍一些特殊场景的用法:
当键名不存在时写入:SetIfNotExist
根据键名取不到值时写入:GetOrSet
package main
import (
"fmt"
"github.com/gogf/gf/os/gcache"
"time"
)
func main() {
// 当键名不存在时写入,设置过期时间1秒
_, _ = gcache.SetIfNotExist("k1", "v1", time.Second)
// 打印当前的键名列表
keys, _ := gcache.Keys()
fmt.Println("打印当前的键名列表:", keys) //[k1]
// 打印当前的键值列表
values, _ := gcache.Values()
fmt.Println("打印当前的键值列表:", values) //[v1]
// 获取指定键值,如果不存在时写入,并返回键值;第三个参数设置为0表示永不过期
v, _ := gcache.GetOrSet("k2", "v2", 0)
fmt.Println("写入的键值:", v) //v2
// 打印当前的键值对
dataMap, _ := gcache.Data()
fmt.Println("打印当前的键值对:", dataMap) // map[k1:v1 k2:v2]
// 等待1秒,以便k1:v1自动过期
time.Sleep(time.Second)
// 再次打印当前的键值对,发现k1:v1已经过期,只剩下k2:v2
data2, _ := gcache.Data()
fmt.Println("等待一秒后,打印当前的键值对:", data2) // map[k2:v2]
}
打印结果
缓存淘汰策略
之前做项目的时候也有这么设计过,现在gcache天然支持缓存淘汰策略
场景分析
给大家举个项目中的栗子:
比如我有一个新闻网站,为了保证新闻详情页的加载速度,会把新闻详情页做缓存处理(内容缓存,评论点赞等动态获取。)
往往新产生的新闻热度和访问量会更高,需要做缓存,而陈旧的新闻因为热度不再,访问量低就可以释放缓存了。
设置缓存时间是一个解决思路,另外的思路就是设置缓存的淘汰策略。
比如:我一共允许缓存100万个缓存详情页,当超过100万个时,会淘汰掉最早缓存的数据,实现动态且稳定的缓存策略。
gcache天然支持这种缓存淘汰策略
代码示例
下面举个简单的栗子:
package main
import (
"fmt"
"github.com/gogf/gf/os/gcache"
"time"
)
func main() {
// 设置LRU淘汰数量
c := gcache.New(2)
// 添加10个元素,不过期
for i := 0; i < 10; i++ {
_ = c.Set(i, i, 0)
}
n, _ := c.Size()
fmt.Println("缓存大小:", n)
keys, _ := c.Keys()
fmt.Println("缓存键值:", keys)
// 读取键名1,保证该键名是优先保留
v, _ := c.Get(1)
fmt.Println("读取键名1的值:", v)
// 等待一定时间后(默认1秒检查一次),
// 元素会被按照从旧到新的顺序进行淘汰
for i := 0; i < 10; i++ {
time.Sleep(2 * time.Second)
n, _ = c.Size()
fmt.Println("缓存大小:", n)
keys, _ = c.Keys()
fmt.Println("缓存键值:", keys)
}
}
打印结果
小技巧
GetOrSetFunc
的使用
GetOrSetFunc
获取一个缓存值,当缓存不存在时执行指定的f func() (interface{}, error)
,缓存该f
方法的结果值,并返回该结果。
来源:https://juejin.cn/post/7107986667293638663


猜你喜欢
- 1.INPUT和图片按钮对齐:<form method="post" action="
- 我就废话不多说了,直接上代码吧!#!/usr/bin/env python# coding:UTF-8"""@
- 这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 如下所示:import webbrowserimport codecsimport timewith open("test.txt
- 前言小程序支持webview以后,我们开发的好多h5页面,就可以直接在小程序里使用了,比如我们开发的微信商城,文章详情页,商品详情页,就可以
- 所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。
- 如果用delayed-insert插入时不用锁表。./bin/mysqldump -uroot -proot &nbs
- 本文列举了所有关于PHP语言中使用socket相关服务的一些函数。注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请
- python中类的继承:子类继承父类,及子类拥有了父类的 属性 和 方法。python中类的初始化都是__init__()。所以父类和子类的
- 用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供
- 在《CSS二级菜单》中,如果一级菜单中的超链接是#,那么只要单击该一级菜单,那么与这个一级菜单对应的二级菜单就会一直显示在网页中,不能隐藏,
- python第三方库的安装PyInstaller库PyInstaller库能够在不同操作系统下将python源文件打包,变成直接可运行的可执
- 1、有了已经训练好的模型参数,对这个模型的某些层做了改变,如何利用这些训练好的模型参数继续训练:pretrained_params = to
- 目录准备xlrd 读取 Excelxlwt 写入 Excel进阶用法最后准备使用 Python 操作 Excel 文件,常见的方式如下:xl
- 一、图像的加法图像相加可以直接利用numpy模块进行相加,也可以采用opencv里面函数进行相加,注意事项:相加的图像类型、大小必须相同具体
- 使用export default导出class类首先我们要创建一个类并导出class win { getProcessInfo(
- 2021年7月1日,官方正式发布了1.0Datatable版本。1.0版本支持windows和linux,以及Macos。 具体文档可以见:
- win32com和微软的word接口文档有什么关系先回答一个网友私信问题: win32com和微软的word接口文档有什么关系win32co
- 总览在Python中,您需要通过打开文件来访问文件。您可以使用 open()函数来实现。Open 返回一个文件对象,该文件对象具有用于获取有
- 目录1.mvc vs mvtmvc:mvt:2.虚拟环境3.安装包4.创建django项目5.创建应用6.模型ORM选项 说明7.后台管理系