網站首頁 編程語言 正文
基本概念
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
方法的結果值,并返回該結果。
總結
這篇文章為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。
原文鏈接:https://juejin.cn/post/7107986667293638663
相關推薦
- 2022-12-06 Docker基礎和常用命令詳解_docker
- 2022-04-30 WPF在自定義文本框中實現輸入法跟隨光標_實用技巧
- 2022-06-11 在Docker容器中部署MSSQL_docker
- 2023-02-07 Pytorch中的廣播機制詳解(Broadcast)_python
- 2022-12-15 Qt開發之使用socket實現遠程控制_C 語言
- 2023-03-27 React里的Fragment標簽的具體使用_React
- 2022-07-08 python?讀寫csv文件方式(創建,追加,覆蓋)_python
- 2022-05-19 pytorch中的?.view()函數的用法介紹_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支