日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

在 Go 中使用接口進行靈活緩存

來源: 責編: 時間:2023-10-28 16:30:03 331觀看
導讀緩存是編程中一種常見的技術,通過存儲昂貴的計算或 IO 結果來快速查找,從而提高性能。在本篇文章中,我們將了解 Go 的接口如何幫助構建靈活、可擴展的緩存。定義緩存接口首先,讓我們定義一個接口,指定緩存功能:type Cache i

緩存是編程中一種常見的技術,通過存儲昂貴的計算或 IO 結果來快速查找,從而提高性能。在本篇文章中,我們將了解 Go 的接口如何幫助構建靈活、可擴展的緩存。4Pa28資訊網(wǎng)——每日最新資訊28at.com

4Pa28資訊網(wǎng)——每日最新資訊28at.com

定義緩存接口

首先,讓我們定義一個接口,指定緩存功能:4Pa28資訊網(wǎng)——每日最新資訊28at.com

type Cache interface {  Get(key string) interface{}  Set(key string, value interface{})}

緩存接口有兩個方法:Get 用于按鍵查找緩存值,Set 用于存儲鍵值對。4Pa28資訊網(wǎng)——每日最新資訊28at.com

通過定義接口,我們將緩存的使用與特定的實現(xiàn)分離開來。任何實現(xiàn)了這些方法的緩存庫都滿足接口的要求。4Pa28資訊網(wǎng)——每日最新資訊28at.com

簡單的內存緩存

讓我們實現(xiàn)一個符合接口的簡單內存緩存:4Pa28資訊網(wǎng)——每日最新資訊28at.com

type InMemoryCache struct { m     sync.Mutex store map[string]interface{}}func NewMemoryCache() *InMemoryCache { return &InMemoryCache{  m:     sync.Mutex{},  store: make(map[string]interface{}), }}func (c *InMemoryCache) Get(key string) interface{} { return c.store[key]}func (c *InMemoryCache) Set(key string, value interface{}) { c.m.Lock() defer c.m.Unlock() c.store[key] = value}

InMemoryCache 使用 map 在內存中存儲條目,并且使用 sync.Mutex 來避免并發(fā)寫的發(fā)生。它實現(xiàn)了 Get 和 Set 方法來管理映射中的條目。4Pa28資訊網(wǎng)——每日最新資訊28at.com

使用緩存

現(xiàn)在我們可以輕松使用緩存了:4Pa28資訊網(wǎng)——每日最新資訊28at.com

mc := NewMemoryCache()mc.Set("hello", "world")mc.Get("hello") // world

通過該接口,我們可以調用 Set 和 Get,而不必擔心實現(xiàn)問題。4Pa28資訊網(wǎng)——每日最新資訊28at.com

其他緩存實現(xiàn)

現(xiàn)在,假設我們想使用 Redis 而不是內存緩存。我們可以創(chuàng)建一個實現(xiàn)相同接口的 RedisCache:4Pa28資訊網(wǎng)——每日最新資訊28at.com

type RedisCache struct { client *redis.Client}func NewRedisCache() *RedisCache { c := &RedisCache{client: redis.NewClient(&redis.Options{  Addr: "localhost:6379", })} return c}func (c *RedisCache) Get(key string) interface{} { ctx := context.Background() return c.client.Get(ctx, key)}func (c *RedisCache) Set(key string, value interface{}) { ctx := context.Background() c.client.Set(ctx, key, value, -1)}

使用方式:4Pa28資訊網(wǎng)——每日最新資訊28at.com

rc := NewRedisCache()rc.Set("hello", "world")rc.Get("hello") // world

客戶端代碼保持不變。這就體現(xiàn)了接口的靈活性。4Pa28資訊網(wǎng)——每日最新資訊28at.com

基于接口的緩存的好處

  • 解耦 - 客戶端代碼無需與特定的緩存庫相耦合。
  • 可維護性--無需修改客戶端代碼即可更改緩存實現(xiàn)。
  • 可測試性--可對緩存進行存根測試或模擬測試。
  • 可重用性--通用緩存接口允許編寫可重用的緩存邏輯。

加料

這里我們看到上面的代碼,有兩個緩存器,也都實現(xiàn)了 Set 和 Get 方法,但是我們初始化的時候是初始化一個真正的對象:InMemoryCache 和 RedisCache 。實際上我們可以定義一個 cache 接口:4Pa28資訊網(wǎng)——每日最新資訊28at.com

type cache interface { Set(key string, value interface{}) Get(key string) interface{}}func DefaultCache() cache { return NewMemoryCache()}func NewCache(tp string) (cache, error) { switch tp { case "redis":  return NewRedisCache(), nil default:  return DefaultCache(), nil } return nil, errors.New("can not found target cache")}

這樣當我們又有其他緩存器需求時,我們實際上無需再更改客戶端的代碼,只需要增加 cache 的實現(xiàn)即可。這樣改造之后,我們的客戶端調用就可以變成這樣:4Pa28資訊網(wǎng)——每日最新資訊28at.com

func main() { c, err := NewCache("") if err != nil {  log.Fatalln(err) } c.Set("hello", "world") c.Get("hello")}

我們使用的對象并不是真正的緩存器對象,而是 cache 接口,而 InMemoryCache 和 RedisCache 都實現(xiàn)了 cache 接口,所以我們調用 Set 和 Get 方法的時候,實際上是對應到緩存器真正的實現(xiàn)。4Pa28資訊網(wǎng)——每日最新資訊28at.com

最后

Go 中的接口有助于構建靈活的庫和應用程序。定義簡單的接口使代碼更整潔:4Pa28資訊網(wǎng)——每日最新資訊28at.com

  • 模塊化 - 可以插入不同的實現(xiàn)。
  • 可擴展 - 可以不間斷地添加新的實現(xiàn)。
  • 可維護 - 組件可以互換,便于維護。
  • 可測試 - 可對組件單獨的單元測試。

通過以最小的開銷提供強大的抽象,接口在 Golang 中對于創(chuàng)建松散耦合和可擴展的系統(tǒng)非常重要。4Pa28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-15570-0.html在 Go 中使用接口進行靈活緩存

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 用C++實現(xiàn)圖像處理中三種常見的濾波算法

下一篇: 開始學習Go編程

標簽:
  • 熱門焦點
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結合這個小小的重要功能可以大大改善您網(wǎng)站的用戶體驗
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創(chuàng)建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據(jù)外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • 滴滴違法違規(guī)被罰80.26億 共存在16項違法事實

    滴滴違法違規(guī)被罰80.26億 存在16項違法事實開始于2121年7月,歷經(jīng)一年時間,網(wǎng)絡安全審查辦公室對“滴滴出行”網(wǎng)絡安全審查終于有了一個暫時的結束。據(jù)“網(wǎng)信
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據(jù)10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統(tǒng)和圖形事業(yè)部總經(jīng)理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經(jīng)應用于 oneAPI devcloud 云服
  • 榮耀Magicbook V 14 2021曙光藍版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創(chuàng)新企業(yè)代表,共同打造人工智能交流平臺。上海市副市
Top 主站蜘蛛池模板: 敦化市| 京山县| 扬州市| 双鸭山市| 武城县| 工布江达县| 荣成市| 吐鲁番市| 本溪| 虹口区| 花莲县| 襄汾县| 青田县| 梧州市| 温泉县| 六枝特区| 穆棱市| 巴林右旗| 美姑县| 苏州市| 郸城县| 宁安市| 健康| 长子县| 抚宁县| 兰西县| 渝北区| 淳化县| 吉木乃县| 谷城县| 漳州市| 大庆市| 平定县| 怀宁县| 祁阳县| 宣城市| 许昌市| 巴马| 肃宁县| 遂川县| 布拖县|