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

Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例

 更新時(shí)間:2022年09月08日 11:27:14   作者:7small7  
這篇文章主要介紹了Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例,Gocache是一個(gè)基于Go語(yǔ)言編寫(xiě)的多存儲(chǔ)驅(qū)動(dòng)的緩存擴(kuò)展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下

前言:

Gocache是一個(gè)基于Go語(yǔ)言編寫(xiě)的多存儲(chǔ)驅(qū)動(dòng)的緩存擴(kuò)展組件。它為您帶來(lái)了許多緩存數(shù)據(jù)的功能。

支持功能

多個(gè)緩存驅(qū)動(dòng)存儲(chǔ):支持內(nèi)存、redis或您自定義存儲(chǔ)驅(qū)動(dòng)。

支持如下功能:

  • 鏈?zhǔn)骄彺妫?/strong>使用具有優(yōu)先級(jí)順序的多個(gè)緩存(例如,內(nèi)存然后回退到redis共享緩存)。
  • 可加載緩存:允許您調(diào)用回調(diào)函數(shù)將數(shù)據(jù)放回緩存中。
  • 指標(biāo)緩存,可讓您存儲(chǔ)有關(guān)緩存使用情況的指標(biāo)(命中、未命中、設(shè)置成功、設(shè)置錯(cuò)誤……)。
  • 自動(dòng)編組/解組緩存值作為結(jié)構(gòu)的編組器。
  • 在存儲(chǔ)中定義默認(rèn)值并在設(shè)置數(shù)據(jù)時(shí)覆蓋它們。
  • 通過(guò)過(guò)期時(shí)間和/或使用標(biāo)簽緩存失效。
  • 泛型的使用。

默認(rèn)情況下,Gocache支持如下幾種緩存驅(qū)動(dòng):

  • 內(nèi)存 (bigcache) (allegro/bigcache)。
  • 內(nèi)存 (ristretto) (dgraph-io/ristretto)。
  • 內(nèi)存 (go-cache) (patrickmn/go-cache)。
  • 內(nèi)存緩存(bradfitz/memcache)。
  • Redis (go-redis/redis)。
  • 空閑緩存(coocood/freecache)。
  • Pegasus ( apache/incubator-pegasus )基準(zhǔn)測(cè)試。

開(kāi)發(fā)緣由

在作者的官網(wǎng)博客中提到這樣的幾句話:

當(dāng)我開(kāi)始在 GraphQL Go 項(xiàng)目上實(shí)現(xiàn)緩存時(shí),它已經(jīng)有一個(gè)內(nèi)存緩存,它使用了一個(gè)具有簡(jiǎn)單 API 的小庫(kù),但也使用了另一個(gè)內(nèi)存緩存庫(kù)來(lái)使用具有不同庫(kù)和 API 的批處理模式加載數(shù)據(jù),做同樣的事情:緩存項(xiàng)目。后來(lái),我們還有一個(gè)需求:除了這個(gè)內(nèi)存緩存之外,我們還想使用 Redis 添加一層分布式緩存,主要是為了避免我們的新 Kubernetes pod 在將新版本的應(yīng)用程序投入生產(chǎn)時(shí)出現(xiàn)空緩存。

因此,作者想到是時(shí)候擁有一個(gè)統(tǒng)一的API來(lái)管理多個(gè)緩存存儲(chǔ):內(nèi)存、redis、memcache 或任何你想要的。

如何使用

安裝

要開(kāi)始使用最新版本的 go-cache,您可以使用以下命令:

go get github.com/eko/gocache/v3

為避免嘗試導(dǎo)入庫(kù)時(shí)出現(xiàn)任何錯(cuò)誤,請(qǐng)使用以下導(dǎo)入語(yǔ)句:

import (
	"github.com/eko/gocache/v3/cache"
	"github.com/eko/gocache/v3/store"
)

如果您遇到任何錯(cuò)誤,請(qǐng)務(wù)必運(yùn)行g(shù)o mod tidy以清理您的 go.mod 文件。

存儲(chǔ)適配器

首先,當(dāng)您要緩存項(xiàng)目時(shí),您必須選擇要緩存項(xiàng)目的位置:在內(nèi)存中?在共享的 redis 或 memcache 中?或者可能在另一個(gè)存儲(chǔ)中。

目前,Gocache 實(shí)現(xiàn)了以下存儲(chǔ):

  • BigCache:內(nèi)存中的存儲(chǔ)。
  • Ristretto : DGraph 提供的另一個(gè)內(nèi)存存儲(chǔ)。
  • Memcache:基于 bradfitz/gomemcache 客戶端庫(kù)的 memcache 存儲(chǔ)。
  • Redis:基于 go-redis/redis 客戶端庫(kù)的 redis 存儲(chǔ)。

所有這些商店都實(shí)現(xiàn)了一個(gè)非常簡(jiǎn)單的 API,它遵循以下接口:

type StoreInterface interface {
	Get(key interface{}) (interface{}, error)
	Set(key interface{}, value interface{}, options *Options) error
	Delete(key interface{}) error
	Invalidate(options InvalidateOptions) error
	Clear() error
	GetType() string
}

此接口代表您可以在商店中執(zhí)行的所有操作,并且每個(gè)操作都調(diào)用客戶端庫(kù)中的必要方法。所有這些存儲(chǔ)都有不同的配置,具體取決于您要使用的客戶端庫(kù),

例如,初始化 Memcache 存儲(chǔ):

store := store.NewMemcache(
	memcache.New("10.0.0.1:11211", "10.0.0.2:11211", "10.0.0.3:11212"),
	&store.Options{
		Expiration: 10*time.Second,
	},
)

然后,必須將初始化的存儲(chǔ)傳遞給緩存對(duì)象構(gòu)造函數(shù)。

緩存適配器

一個(gè)緩存接口來(lái)統(tǒng)治它們。

緩存接口與存儲(chǔ)接口完全相同,因?yàn)榛旧?,緩存將?duì)存儲(chǔ)執(zhí)行操作:

type CacheInterface interface {
	Get(key interface{}) (interface{}, error)
	Set(key, object interface{}, options *store.Options) error
	Delete(key interface{}) error
	Invalidate(options store.InvalidateOptions) error
	Clear() error
	GetType() string
}

使用這個(gè)界面,我可以對(duì)緩存項(xiàng)執(zhí)行所有必要的操作:設(shè)置、獲取、刪除、無(wú)效數(shù)據(jù)、清除所有緩存和另一個(gè)方法 (GetType),它可以讓我知道當(dāng)前緩存項(xiàng)是什么,很有用在某些情況下。

從這個(gè)接口開(kāi)始,實(shí)現(xiàn)的緩存類型如下:

  • Cache:允許操作來(lái)自給定存儲(chǔ)的數(shù)據(jù)的基本緩存。
  • Chain:一個(gè)特殊的緩存適配器,允許鏈接多個(gè)緩存(可能是因?yàn)槟阌幸粋€(gè)內(nèi)存緩存,一個(gè)redis緩存等......)。
  • Loadable: 一個(gè)特殊的緩存適配器,允許指定一種回調(diào)函數(shù),如果過(guò)期或失效,自動(dòng)將數(shù)據(jù)重新加載到緩存中。
  • Metric:一個(gè)特殊的緩存適配器,允許存儲(chǔ)有關(guān)緩存數(shù)據(jù)的指標(biāo):設(shè)置、獲取、失效、成功與否的項(xiàng)目數(shù)。 當(dāng)所有這些緩存都實(shí)現(xiàn)相同的接口并且可以相互包裝時(shí),美妙之處就出現(xiàn)了:一個(gè)指標(biāo)緩存可以采用一個(gè)可加載的緩存,該緩存可以采用一個(gè)可以采用多個(gè)緩存的鏈?zhǔn)骄彺妗?/li>

下面是一個(gè)簡(jiǎn)單的 Memcache 示例:

memcacheStore := store.NewMemcache(
	memcache.New("10.0.0.1:11211", "10.0.0.2:11211", "10.0.0.3:11212"),
	&store.Options{
		Expiration: 10*time.Second,
	},
)
cacheManager := cache.New(memcacheStore)
err := cacheManager.Set("my-key", []byte("my-value"), &cache.Options{
	Expiration: 15*time.Second, // Override default value of 10 seconds defined in the store
})
if err != nil {
    panic(err)
}
value := cacheManager.Get("my-key")
cacheManager.Delete("my-key")
cacheManager.Clear() 
// Clears the entire cache, in case you want to flush all cache

現(xiàn)在,假設(shè)您想要一個(gè)鏈?zhǔn)骄彺?,其中包含一個(gè)內(nèi)存 Ristretto 存儲(chǔ)和一個(gè)分布式 Redis 存儲(chǔ)作為后備,

并帶有一個(gè) marshaller 和指標(biāo)作為結(jié)果:

// Initialize Ristretto cache and Redis client
ristrettoCache, err := ristretto.NewCache(&ristretto.Config{NumCounters: 1000, MaxCost: 100, BufferItems: 64})
if err != nil {
    panic(err)
}
redisClient := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"})

// Initialize stores
ristrettoStore := store.NewRistretto(ristrettoCache, nil)
redisStore := store.NewRedis(redisClient, &cache.Options{Expiration: 5*time.Second})

// Initialize Prometheus metrics
promMetrics := metrics.NewPrometheus("my-amazing-app")
// Initialize chained cache
cacheManager := cache.NewMetric(promMetrics, cache.NewChain(
    cache.New(ristrettoStore),
    cache.New(redisStore),
))
// Initializes a marshaler
marshal := marshaler.New(cacheManager)

key := BookQuery{Slug: "my-test-amazing-book"}
value := Book{ID: 1, Name: "My test amazing book", Slug: "my-test-amazing-book"}

// Set the value in cache using given key
err = marshal.Set(key, value)
if err != nil {
    panic(err)
}
returnedValue, err := marshal.Get(key, new(Book))
if err != nil {
    panic(err)
}
// Then, do what you want with the value

我們還沒(méi)有談到 Marshaler,但它是 Gocache 的另一個(gè)功能:我們提供了一項(xiàng)服務(wù)來(lái)幫助您自動(dòng)編組/解組您的對(duì)象從/到您的存儲(chǔ)。

這在使用 struct 對(duì)象作為鍵而不是內(nèi)存存儲(chǔ)時(shí)很有用,因?yàn)槟仨殞?duì)象轉(zhuǎn)換為字節(jié)。

所有這些功能:帶有內(nèi)存和 redis 的鏈?zhǔn)骄彺?、Prometheus 指標(biāo)和封送處理程序只需大約 20 行代碼即可完成。

編寫(xiě)自己的緩存或存儲(chǔ)

如果您想實(shí)現(xiàn)自己的專有緩存,也很容易做到。

這是一個(gè)簡(jiǎn)單的示例,以防您想要記錄在緩存中完成的每個(gè)操作(這不是一個(gè)好主意,但很好,這是一個(gè)簡(jiǎn)單的 todo 示例):

package customcache
import (
	"log"

	"github.com/eko/gocache/cache"
	"github.com/eko/gocache/store"
)
const LoggableType = "loggable"
type LoggableCache struct {
	cache cache.CacheInterface
}
func NewLoggable(cache cache.CacheInterface) *LoggableCache {
	return &LoggableCache{
		cache: cache,
	}
}

func (c *LoggableCache) Get(key interface{}) (interface{}, error) {
	log.Print("Get some data...")
	return c.cache.Get(key)
}

func (c *LoggableCache) Set(key, object interface{}, options *store.Options) error {
	log.Print("Set some data...")
	return c.cache.Set(key, object, options)
}
func (c *LoggableCache) Delete(key interface{}) error {
	log.Print("Delete some data...")
	return c.cache.Delete(key)
}
func (c *LoggableCache) Invalidate(options store.InvalidateOptions) error {
	log.Print("Invalidate some data...")
	return c.cache.Invalidate(options)
}
func (c *LoggableCache) Clear() error {
	log.Print("Clear some data...")
	return c.cache.Clear()
}
func (c *LoggableCache) GetType() string {
	return LoggableType
}

同樣,您也可以實(shí)現(xiàn)自定義存儲(chǔ)。如果您認(rèn)為其他人可以使您的緩存或存儲(chǔ)實(shí)現(xiàn)受益,請(qǐng)不要猶豫,打開(kāi)拉取請(qǐng)求并直接為項(xiàng)目做出貢獻(xiàn),以便我們一起討論您的想法并帶來(lái)更強(qiáng)大的緩存庫(kù)。

壓縮

生成模擬測(cè)試數(shù)據(jù):

go get github.com/golang/mock/mockgen
make mocks

測(cè)試套件可以運(yùn)行:

make test # run unit test
make benchmark-store # run benchmark test

到此這篇關(guān)于Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例的文章就介紹到這了,更多相關(guān)Golang SDK內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的解決辦法

    這篇文章主要介紹了Golang使用gin模板渲染base64圖片出現(xiàn)#ZgotmplZ的的場(chǎng)景復(fù)現(xiàn)和解決辦法,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Go語(yǔ)言的隊(duì)列和堆棧實(shí)現(xiàn)方法

    Go語(yǔ)言的隊(duì)列和堆棧實(shí)現(xiàn)方法

    這篇文章主要介紹了Go語(yǔ)言的隊(duì)列和堆棧實(shí)現(xiàn)方法,涉及container/list包的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例

    Go語(yǔ)言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 用Go獲取短信驗(yàn)證碼的示例代碼

    用Go獲取短信驗(yàn)證碼的示例代碼

    要用Go獲取短信驗(yàn)證碼,通常需要連接到一個(gè)短信服務(wù)提供商的API,并通過(guò)該API發(fā)送請(qǐng)求來(lái)獲取驗(yàn)證碼,由于不同的短信服務(wù)提供商可能具有不同的API和授權(quán)方式,我將以一個(gè)簡(jiǎn)單的示例介紹如何使用Go語(yǔ)言來(lái)獲取短信驗(yàn)證碼,需要的朋友可以參考下
    2023-07-07
  • Go語(yǔ)言并發(fā)編程之控制并發(fā)數(shù)量實(shí)現(xiàn)實(shí)例

    Go語(yǔ)言并發(fā)編程之控制并發(fā)數(shù)量實(shí)現(xiàn)實(shí)例

    這篇文章主要為大家介紹了Go語(yǔ)言并發(fā)編程之控制并發(fā)數(shù)量實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 用Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)Web服務(wù)之項(xiàng)目介紹

    用Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)Web服務(wù)之項(xiàng)目介紹

    從本節(jié)開(kāi)始將從后端到前端一步一步實(shí)現(xiàn)一個(gè)Go語(yǔ)言Web服務(wù),后端除了MySQL驅(qū)動(dòng),全部使用Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)來(lái)實(shí)現(xiàn)一個(gè)小型項(xiàng)目,本篇將簡(jiǎn)單的介紹一下項(xiàng)目開(kāi)發(fā)要準(zhǔn)備的流程,感興趣的同學(xué)可以閱讀一下
    2023-05-05
  • golang?gorm的Callbacks事務(wù)回滾對(duì)象操作示例

    golang?gorm的Callbacks事務(wù)回滾對(duì)象操作示例

    這篇文章主要為大家介紹了golang?gorm的Callbacks事務(wù)回滾對(duì)象操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go json反序列化“null“的問(wèn)題解決

    Go json反序列化“null“的問(wèn)題解決

    本文主要介紹了Go json反序列化“null“的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go使用defer函數(shù)要注意的幾個(gè)點(diǎn)

    Go使用defer函數(shù)要注意的幾個(gè)點(diǎn)

    這篇文章主要介紹了Go使用defer函數(shù)要注意的幾個(gè)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Go中如何使用set的方法示例

    Go中如何使用set的方法示例

    這篇文章主要介紹了Go中如何使用set的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

建昌县| 福泉市| 桂阳县| 都兰县| 石台县| 大邑县| 舞阳县| 尤溪县| 连江县| 承德市| 搜索| 宜川县| 曲沃县| 卓尼县| 肇东市| 离岛区| 拜城县| 商丘市| 昌图县| 澎湖县| 英山县| 阿城市| 屏东市| 卫辉市| 偏关县| 凤山县| 克山县| 云阳县| 保定市| 抚州市| 日喀则市| 房山区| 龙州县| 抚顺市| 涪陵区| 淮阳县| 九台市| 合山市| 突泉县| 阳江市| 隆林|