最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoFrame框架gcache的緩存控制淘汰策略實(shí)踐示例

 更新時(shí)間:2022年06月13日 09:02:39   作者:王中陽Go  
這篇文章主要為大家介紹了GoFrame框架gcache的緩存控制淘汰策略的實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

基本概念

gcache模塊默認(rèn)提供的是一個(gè)高速的內(nèi)存緩存,操作效率非常高效,CPU性能損耗在ns納秒級別。使用簡單易上手,非常適合單機(jī)應(yīng)用使用。

基本使用

我們可以通過gcache.New()創(chuàng)建一個(gè)緩存對象

也可以直接使用gcache包方法,使用方式都是一樣的。

下面代碼段介紹了gcache的基本使用:

package main
import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "github.com/gogf/gf/os/gtime"
)
func main() {
   // 創(chuàng)建一個(gè)緩存對象,
   c := gcache.New()
   // 設(shè)置緩存,不過期
   _ = c.Set("k1", "v1", 0)
   // 獲取緩存
   v, _ := c.Get("k1")
   fmt.Println("k1對應(yīng)的值:", 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
   // 關(guān)閉緩存對象,讓GC回收資源
   _ = c.Close()
   // 當(dāng)然也可以便捷地直接使用gcache包方法,使用方式和上面的一樣
   _ = gcache.Set("k2", "v2", gtime.M*30) //半小時(shí)后到期
   k2Value, _ := gcache.Get("k2")
   fmt.Println("k2對應(yīng)的值:", k2Value) //v2
}

打印結(jié)果

緩存控制

下面介紹一些特殊場景的用法:

當(dāng)鍵名不存在時(shí)寫入:SetIfNotExist

根據(jù)鍵名取不到值時(shí)寫入:GetOrSet

package main
import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)
func main() {
   // 當(dāng)鍵名不存在時(shí)寫入,設(shè)置過期時(shí)間1秒
   _, _ = gcache.SetIfNotExist("k1", "v1", time.Second)
   // 打印當(dāng)前的鍵名列表
   keys, _ := gcache.Keys()
   fmt.Println("打印當(dāng)前的鍵名列表:", keys) //[k1]
   // 打印當(dāng)前的鍵值列表
   values, _ := gcache.Values()
   fmt.Println("打印當(dāng)前的鍵值列表:", values) //[v1]
   // 獲取指定鍵值,如果不存在時(shí)寫入,并返回鍵值;第三個(gè)參數(shù)設(shè)置為0表示永不過期
   v, _ := gcache.GetOrSet("k2", "v2", 0)
   fmt.Println("寫入的鍵值:", v) //v2
   // 打印當(dāng)前的鍵值對
   dataMap, _ := gcache.Data()
   fmt.Println("打印當(dāng)前的鍵值對:", dataMap) // map[k1:v1 k2:v2]
   // 等待1秒,以便k1:v1自動(dòng)過期
   time.Sleep(time.Second)
   // 再次打印當(dāng)前的鍵值對,發(fā)現(xiàn)k1:v1已經(jīng)過期,只剩下k2:v2
   data2, _ := gcache.Data()
   fmt.Println("等待一秒后,打印當(dāng)前的鍵值對:", data2) // map[k2:v2]
}

打印結(jié)果

緩存淘汰策略

之前做項(xiàng)目的時(shí)候也有這么設(shè)計(jì)過,現(xiàn)在gcache天然支持緩存淘汰策略

場景分析

給大家舉個(gè)項(xiàng)目中的栗子:

比如我有一個(gè)新聞網(wǎng)站,為了保證新聞詳情頁的加載速度,會(huì)把新聞詳情頁做緩存處理(內(nèi)容緩存,評論點(diǎn)贊等動(dòng)態(tài)獲取。)

往往新產(chǎn)生的新聞熱度和訪問量會(huì)更高,需要做緩存,而陳舊的新聞因?yàn)闊岫炔辉?,訪問量低就可以釋放緩存了。

設(shè)置緩存時(shí)間是一個(gè)解決思路,另外的思路就是設(shè)置緩存的淘汰策略。

比如:我一共允許緩存100萬個(gè)緩存詳情頁,當(dāng)超過100萬個(gè)時(shí),會(huì)淘汰掉最早緩存的數(shù)據(jù),實(shí)現(xiàn)動(dòng)態(tài)且穩(wěn)定的緩存策略。

gcache天然支持這種緩存淘汰策略

代碼示例

下面舉個(gè)簡單的栗子:

package main
import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)
func main() {
   // 設(shè)置LRU淘汰數(shù)量
   c := gcache.New(2)
   // 添加10個(gè)元素,不過期
   for i := 0; i < 10; i++ {
      _ = c.Set(i, i, 0)
   }
   n, _ := c.Size()
   fmt.Println("緩存大小:", n)
   keys, _ := c.Keys()
   fmt.Println("緩存鍵值:", keys)
   // 讀取鍵名1,保證該鍵名是優(yōu)先保留
   v, _ := c.Get(1)
   fmt.Println("讀取鍵名1的值:", v)
   // 等待一定時(shí)間后(默認(rèn)1秒檢查一次),
   // 元素會(huì)被按照從舊到新的順序進(jìn)行淘汰
   for i := 0; i < 10; i++ {
      time.Sleep(2 * time.Second)
      n, _ = c.Size()
      fmt.Println("緩存大小:", n)
      keys, _ = c.Keys()
      fmt.Println("緩存鍵值:", keys)
   }
}

打印結(jié)果

小技巧

GetOrSetFunc的使用

GetOrSetFunc獲取一個(gè)緩存值,當(dāng)緩存不存在時(shí)執(zhí)行指定的f func() (interface{}, error),緩存該f方法的結(jié)果值,并返回該結(jié)果。

總結(jié)

這篇文章為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。

單機(jī)項(xiàng)目可以使用gcache做緩存處理,簡單方便易上手;分布式應(yīng)用可以使用gredis做緩存處理,下一篇介紹gredis的使用,更多關(guān)于GoFrame gcache 緩存控制 淘汰策略的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang切片連接成字符串的實(shí)現(xiàn)示例

    Golang切片連接成字符串的實(shí)現(xiàn)示例

    本文主要介紹了Golang切片連接成字符串的實(shí)現(xiàn)示例,可以使用Go語言中的內(nèi)置函數(shù)"String()"可以將字節(jié)切片轉(zhuǎn)換為字符串,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Golang實(shí)現(xiàn)單元測試中的接口層

    Golang實(shí)現(xiàn)單元測試中的接口層

    接口層主要負(fù)責(zé)的就是請求的處理,最常見的就是?HTTP?請求的處理。這篇文章主要為大家介紹了Golang如何實(shí)現(xiàn)單元測試中的接口層,需要的可以參考一下
    2023-03-03
  • Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解

    Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解

    這篇文章主要為大家介紹了Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 使用Golang實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析

    使用Golang實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析

    在網(wǎng)絡(luò)通信中,網(wǎng)絡(luò)數(shù)據(jù)包是信息傳遞的基本單位,抓包是一種監(jiān)控和分析網(wǎng)絡(luò)流量的方法,用于獲取網(wǎng)絡(luò)數(shù)據(jù)包并對其進(jìn)行分析,本文將介紹如何使用Golang實(shí)現(xiàn)抓包功能,包括網(wǎng)絡(luò)數(shù)據(jù)包捕獲和數(shù)據(jù)包分析,需要的朋友可以參考下
    2023-11-11
  • go程序執(zhí)行交叉編譯的流程步驟

    go程序執(zhí)行交叉編譯的流程步驟

    go程序可用通過交叉編譯的方式在一個(gè)平臺(tái)輸出多個(gè)平臺(tái)可運(yùn)行的二進(jìn)制包,本文給大家詳細(xì)介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Golang?Mutex?原理詳細(xì)解析

    Golang?Mutex?原理詳細(xì)解析

    這篇文章主要介紹了Golang?Mutex原理詳細(xì)解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Golang操作sqlite3數(shù)據(jù)庫的詳細(xì)教程

    Golang操作sqlite3數(shù)據(jù)庫的詳細(xì)教程

    最近會(huì)使用到sqlite3,這里作個(gè)記錄,記性越來越差就是這樣,下面這篇文章主要給大家介紹了關(guān)于Golang操作sqlite3數(shù)據(jù)庫的詳細(xì)教程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Golang?編寫Tcp服務(wù)器的解決方案

    Golang?編寫Tcp服務(wù)器的解決方案

    Golang?作為廣泛用于服務(wù)端和云計(jì)算領(lǐng)域的編程語言,tcp?socket?是其中至關(guān)重要的功能,這篇文章給大家介紹Golang?開發(fā)?Tcp?服務(wù)器及拆包粘包、優(yōu)雅關(guān)閉的解決方案,感興趣的朋友一起看看吧
    2022-10-10
  • 深入解析golang中的標(biāo)準(zhǔn)庫flag

    深入解析golang中的標(biāo)準(zhǔn)庫flag

    Go語言內(nèi)置的flag包實(shí)現(xiàn)了命令行參數(shù)的解析,flag包使得開發(fā)命令行工具更為簡單,下面通過本文給大家詳細(xì)介紹下golang中的標(biāo)準(zhǔn)庫flag相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-11-11
  • 深入理解?Go?中的字符串

    深入理解?Go?中的字符串

    這篇文章主要介紹了深入理解?Go?中的字符串,在編程語言中,字符串發(fā)揮著重要的角色。字符串背后的數(shù)據(jù)結(jié)構(gòu)一般有兩種類型,一種在編譯時(shí)指定長度不能修改,一種具有動(dòng)態(tài)的長度可以修改,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-05-05

最新評論

炉霍县| 青岛市| 天柱县| 井研县| 疏附县| 浠水县| 定兴县| 阳新县| 张家港市| 潼关县| 辽阳县| 阳谷县| 瓦房店市| 沅陵县| 紫阳县| 赤水市| 蓝田县| 灵璧县| 三都| 天气| 南和县| 丹凤县| 凌海市| 阿荣旗| 弥勒县| 红河县| 正宁县| 高邮市| 二手房| 景德镇市| 临泽县| 江北区| 文山县| 宜兰县| 郑州市| 康乐县| 金寨县| 广汉市| 黄大仙区| 文昌市| 沁水县|