欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Golang中g(shù)cache模塊的基本使用

 更新時(shí)間:2022年11月02日 08:23:15   作者:王中陽(yáng)Go  
這篇文章主要通過(guò)結(jié)合商業(yè)項(xiàng)目的使用場(chǎng)景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。使用gcache做緩存處理,簡(jiǎn)單方便易上手

gcache提供統(tǒng)一的緩存管理模塊,提供了開(kāi)發(fā)者可自定義靈活接入的緩存適配接口,并默認(rèn)提供了高速內(nèi)存緩存適配實(shí)現(xiàn)。

先說(shuō)結(jié)論

這篇文章通過(guò)結(jié)合商業(yè)項(xiàng)目的使用場(chǎng)景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。

使用gcache做緩存處理,簡(jiǎn)單方便易上手!

優(yōu)勢(shì)

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

基本使用

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

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

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

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "github.com/gogf/gf/os/gtime"
)

func main() {
   // 創(chuàng)建一個(gè)緩存對(duì)象,
   c := gcache.New()
   // 設(shè)置緩存,不過(guò)期
   _ = c.Set("k1", "v1", 0)

   // 獲取緩存
   v, _ := c.Get("k1")
   fmt.Println("k1對(duì)應(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)閉緩存對(duì)象,讓GC回收資源
   _ = c.Close()

   // 當(dāng)然也可以便捷地直接使用gcache包方法,使用方式和上面的一樣
   _ = gcache.Set("k2", "v2", gtime.M*30) //半小時(shí)后到期
   k2Value, _ := gcache.Get("k2")
   fmt.Println("k2對(duì)應(yīng)的值:", k2Value) //v2
}

打印結(jié)果

緩存控制

下面介紹一些特殊場(chǎng)景的用法:

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

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

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)

func main() {
   // 當(dāng)鍵名不存在時(shí)寫(xiě)入,設(shè)置過(guò)期時(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í)寫(xiě)入,并返回鍵值;第三個(gè)參數(shù)設(shè)置為0表示永不過(guò)期
   v, _ := gcache.GetOrSet("k2", "v2", 0)
   fmt.Println("寫(xiě)入的鍵值:", v) //v2

   // 打印當(dāng)前的鍵值對(duì)
   dataMap, _ := gcache.Data()
   fmt.Println("打印當(dāng)前的鍵值對(duì):", dataMap) // map[k1:v1 k2:v2]

   // 等待1秒,以便k1:v1自動(dòng)過(guò)期
   time.Sleep(time.Second)

   // 再次打印當(dāng)前的鍵值對(duì),發(fā)現(xiàn)k1:v1已經(jīng)過(guò)期,只剩下k2:v2
   data2, _ := gcache.Data()
   fmt.Println("等待一秒后,打印當(dāng)前的鍵值對(duì):", data2) // map[k2:v2]
}

打印結(jié)果

緩存淘汰策略

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

實(shí)戰(zhàn)舉例

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

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

一般來(lái)說(shuō)新產(chǎn)生的新聞熱度和訪(fǎng)問(wèn)量會(huì)更高,需要做緩存,而陳舊的新聞因?yàn)闊岫炔辉?,訪(fǎng)問(wèn)量較低就從緩存中釋放了。

解決上面的問(wèn)題一般有2種思路:

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

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

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

代碼示例

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

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)

func main() {
   // 設(shè)置LRU淘汰數(shù)量
   c := gcache.New(2)

   // 添加10個(gè)元素,不過(guò)期
   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é)

這篇文章通過(guò)結(jié)合商業(yè)項(xiàng)目的使用場(chǎng)景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。

單機(jī)項(xiàng)目可以使用gcache做緩存處理,簡(jiǎn)單方便易上手;

以上就是詳解Golang中g(shù)cache模塊的基本使用的詳細(xì)內(nèi)容,更多關(guān)于Golang gcache模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go語(yǔ)言如何利用高階函數(shù)寫(xiě)出優(yōu)雅的代碼

    詳解Go語(yǔ)言如何利用高階函數(shù)寫(xiě)出優(yōu)雅的代碼

    高階函數(shù)(Hiher-order?Function)定義為:滿(mǎn)足下列條件之一的函數(shù):接收一個(gè)或多個(gè)函數(shù)作為參數(shù);返回值是一個(gè)函數(shù)。本文為大家介紹了如何利用高階函數(shù)寫(xiě)出優(yōu)雅的代碼,希望對(duì)大家有所幫助
    2023-01-01
  • GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列詳細(xì)講解

    GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列詳細(xì)講解

    這篇文章主要介紹了GoLang RabbitMQ TTL與死信隊(duì)列以及延遲隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • go操作Kafka使用示例詳解

    go操作Kafka使用示例詳解

    這篇文章主要為大家介紹了go操作Kafka使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語(yǔ)言學(xué)習(xí)教程之反射的示例詳解

    Go語(yǔ)言學(xué)習(xí)教程之反射的示例詳解

    這篇文章主要通過(guò)記錄對(duì)reflect包的簡(jiǎn)單使用,來(lái)對(duì)反射有一定的了解。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下
    2022-09-09
  • Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的一個(gè)靜態(tài)WEB服務(wù)器

    Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的一個(gè)靜態(tài)WEB服務(wù)器

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的一個(gè)靜態(tài)WEB服務(wù)器,本文給出了實(shí)現(xiàn)代碼和運(yùn)行效果,學(xué)習(xí)Golang的練手作品,需要的朋友可以參考下
    2014-10-10
  • 深入理解go slice結(jié)構(gòu)

    深入理解go slice結(jié)構(gòu)

    這篇文章主要介紹了go slice結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法

    go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法

    這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法,實(shí)例分析了Go語(yǔ)言流程判斷與處理的技巧,需要的朋友可以參考下
    2015-03-03
  • golang通過(guò)cgo調(diào)用C++庫(kù)源碼示例

    golang通過(guò)cgo調(diào)用C++庫(kù)源碼示例

    這篇文章主要給大家介紹了關(guān)于golang通過(guò)cgo調(diào)用C++庫(kù)的相關(guān)資料,CGO是GO語(yǔ)言里面的一個(gè)特性,CGO屬于GOLANG的高級(jí)用法,主要是通過(guò)使用GOLANG調(diào)用CLANG實(shí)現(xiàn)的程序庫(kù),需要的朋友可以參考下
    2024-02-02
  • 通過(guò)示例深度理解Go channel range

    通過(guò)示例深度理解Go channel range

    這篇文章主要為大家介紹了Go channel range使用示例深度理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Golang定時(shí)器Timer與Ticker的使用詳解

    Golang定時(shí)器Timer與Ticker的使用詳解

    在 Go 里有很多種定時(shí)器的使用方法,像常規(guī)的 Timer、Ticker 對(duì)象,本文主要為大家介紹了Timer與Ticker的使用,感興趣的小伙伴可以了解一下
    2023-05-05

最新評(píng)論