精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go中使用sync.Map實現線程安全的緩存

開發 后端
在本文中,我們展示了如何使用sync.Map包在Go中實現一個簡單、線程安全的緩存。

緩存是優化現代應用程序性能的關鍵方面。它允許您存儲并快速檢索昂貴操作的結果或經常訪問的數據,減少了反復重新計算或獲取數據的需要。在本文中,我們將探討如何使用sync.Map包在Go中實現線程安全的緩存。這種緩存實現支持緩存條目的過期,確保過時的數據不會滯留在緩存中。

為什么要費心

在我們開始實現自己的線程安全內存緩存之前,讓我們考慮一下其優缺點。考慮到替代方案是使用為緩存而發明的、有長期使用和支持歷史的外部庫(工具),讓我們思考一下優點和缺點。

使用Go的sync.Map實現自己的線程安全緩存相比使用像Redis這樣的外部庫有幾個優點,這取決于您的用例和要求。以下是使用sync.Map創建自己的緩存可能有優勢的一些原因:

  • 更低的延遲:使用像sync.Map這樣的內存緩存時,數據存儲在應用程序的內存中。這可能導致比需要應用程序和緩存服務之間的網絡通信的單獨服務,如Redis,有更低的訪問延遲。
  • 更簡單的部署:使用基于sync.Map的緩存,無需部署、配置和維護像Redis這樣的額外服務。您的緩存解決方案是應用程序的一部分,使部署過程更簡單,并可能減少操作復雜性。
  • 減少資源使用:與像Redis這樣的外部服務相比,使用sync.Map的內存緩存通常消耗更少的資源,從而節省了內存和CPU使用。這對于小規模的應用程序或資源緊張的應用程序可能更加經濟高效。
  • 更容易集成:在Go應用程序中直接使用sync.Map實現緩存可以更容易地與現有的代碼庫集成。您不需要學習新的API或管理到外部服務的連接。
  • 定制性:創建自己的緩存實現時,您可以完全控制其行為和功能。您可以輕松地根據具體需求調整緩存,針對您的用例進行優化,并根據需要添加自定義過期策略或其他功能。
  • 樂趣:創建實現緩存的自己的代碼段會帶來很多樂趣,并幫助更好地理解提供緩存功能的外部庫。更好地理解它們有助于更好地利用它們提供的所有功能。

但是,值得注意的是,使用像Redis這樣的外部緩存解決方案對于較大規模的應用程序或那些有更復雜的緩存需求的應用程序有其自身的一系列優勢。使用Redis的一些好處包括:

  • 可擴展性:Redis設計用于高性能,并可以水平擴展以處理大量請求和數據大小。
  • 持久性:Redis支持不同級別的數據持久性,確保您的緩存數據在重啟或崩潰后仍然存在。
  • 高級功能:除了簡單的鍵值緩存外,Redis還提供了一系列功能,如數據結構、發布/訂閱消息等。

最終,選擇使用sync.Map實現自己的緩存還是使用像Redis這樣的外部庫將取決于您的具體需求、應用程序的規模以及您在性能、復雜性和資源方面愿意做的權衡。

此外,實現您的緩存會帶來樂趣并幫助更好地理解像Redis這樣的更復雜的產品。因此,我們將在此文章中實現一個。

為什么我們使用sync.Map

簡單地說,因為它完美地滿足了我們的需要。更深入的解釋 - sync.Map是Go標準庫中的一個并發的、線程安全的map實現。它設計用于在多個goroutine并發訪問映射的情況下使用,并且鍵的數量是未知的或隨時間變化的。

值得注意的是,雖然sync.Map是特定用例的一個很好的選擇,但它并不意味著要替換所有場景的內置map類型。特別是,sync.Map最適合以下情況:

  • 映射主要是讀取密集型,偶爾寫入。
  • 鍵的數量隨時間變化或事先不知道。
  • 映射由多個goroutine并發訪問。

在鍵的數量是固定的或事先知道的情況下,且映射可以預先分配,使用適當的同步如sync.Mutex或sync.RWMutex的內置map類型可能會提供更好的性能。

創建SafeCache

如上所述,我們的SafeCache是一個簡單的、線程安全的緩存,使用Go的sync.Map存儲其鍵值對。

首先,我們定義一個CacheEntry結構來保存值及其過期時間戳:

type CacheEntry struct {
    value      interface{}
    expiration int64
}

在SafeCache結構中嵌入了一個sync.Map,它提供了對鍵值對的并發安全訪問:

type SafeCache struct {
    syncMap sync.Map
}

向緩存中添加值

然后我們定義了一個 Set 方法,該方法允許我們在緩存中存儲一個帶有指定生存時間(TTL,Time To Live)的值。TTL 決定了緩存條目應被認為有效的時間長度。一旦 TTL 過期,在下一個清理周期中將會移除該緩存條目。

func (sc *SafeCache) Set(key string, value interface{}, ttl time.Duration) {
    expiration := time.Now().Add(ttl).UnixNano()
    sc.syncMap.Store(key, CacheEntry{value: value, expiration: expiration})
}

從緩存中檢索值

接下來需要的方法是 Get,它使用鍵從緩存中檢索值。如果沒有找到該值或該值已過期,該方法將返回 false:

func (sc *SafeCache) Get(key string) (interface{}, bool) {
    // ... (see the provided code for the full implementation)
}

在 Get 方法中重要的是從緩存加載值后進行類型斷言。我們依賴于 sync.Map 的 Load 方法,該方法返回接口。

entry, found := sc.syncMap.Load(key)
 if !found {
  return nil, false
 }
 // Type assertion to CacheEntry, as entry is an interface{}
 cacheEntry := entry.(CacheEntry)

從緩存中移除值

當然,我們還需要一個 Delete 方法,使我們能夠從緩存中移除一個值:

func (sc *SafeCache) Delete(key string) {
    sc.syncMap.Delete(key)
}

清理過期條目

我們通過 CleanUp 方法擴展了緩存,該方法負責定期從緩存中刪除過期的條目。它使用 sync.Map 提供的 Range 方法遍歷緩存中的所有鍵值對,并刪除那些TTL已過期的條目:

func (sc *SafeCache) CleanUp() {
    // ... (see the provided code for the full implementation)
}

要運行 CleanUp 方法,我們可以在初始化緩存時啟動一個單獨的 Goroutine:

cache := &SafeCache{}
go cache.CleanUp()

完整的代碼片段

package cache

import (
 "sync"
 "time"
)

// CacheEntry is a value stored in the cache.
type CacheEntry struct {
 value      interface{}
 expiration int64
}

// SafeCache is a thread-safe cache.
type SafeCache struct {
 syncMap sync.Map
}

// Set stores a value in the cache with a given TTL
// (time to live) in seconds.
func (sc *SafeCache) Set(key string, value interface{}, ttl time.Duration) {
 expiration := time.Now().Add(ttl).UnixNano()
 sc.syncMap.Store(key, CacheEntry{value: value, expiration: expiration})
}

// Get retrieves a value from the cache. If the value is not found
// or has expired, it returns false.
func (sc *SafeCache) Get(key string) (interface{}, bool) {
 entry, found := sc.syncMap.Load(key)
 if !found {
  return nil, false
 }
 // Type assertion to CacheEntry, as entry is an interface{}
 cacheEntry := entry.(CacheEntry)
 if time.Now().UnixNano() > cacheEntry.expiration {
  sc.syncMap.Delete(key)
  return nil, false
 }
 return cacheEntry.value, true
}

// Delete removes a value from the cache.
func (sc *SafeCache) Delete(key string) {
 sc.syncMap.Delete(key)
}

// CleanUp periodically removes expired entries from the cache.
func (sc *SafeCache) CleanUp() {
 for {
  time.Sleep(1 * time.Minute)
  sc.syncMap.Range(func(key, entry interface{}) bool {
   cacheEntry := entry.(CacheEntry)
   if time.Now().UnixNano() > cacheEntry.expiration {
    sc.syncMap.Delete(key)
   }
   return true
  })
 }
}

最后,你可以運行以下的 main.go 程序來檢查緩存是否工作。我們創建了一個HTTP服務器,它在“/compute”端點監聽請求。該服務器接受一個整數n作為查詢參數,并返回昂貴計算的結果(在這種情況下,帶有模擬延遲的簡單平方操作)。服務器首先檢查緩存,看看給定輸入的結果是否已經被緩存;如果沒有,它會計算結果,將其存儲在緩存中,并將其返回給客戶端。

要測試服務器,運行代碼并請求http://localhost:8080/compute?n=5。第一個請求會花費更長的時間(由于模擬的延遲),但具有相同n的后續請求將立即返回緩存的結果。

package main

import (
 "fmt"
 "log"
 "net/http"
 "safe-cache/cache"
 "strconv"
 "time"
)


func expensiveComputation(n int) int {
 // Simulate an expensive computation
 time.Sleep(2 * time.Second)
 return n * n
}

func main() {
 safeCache := &cache.SafeCache{}
 // Start a goroutine to periodically clean up the cache
 go safeCache.CleanUp()

 http.HandleFunc("/compute", func(w http.ResponseWriter, r *http.Request) {
  query := r.URL.Query()
  n, err := strconv.Atoi(query.Get("n"))
  if err != nil {
   http.Error(w, "Invalid input", http.StatusBadRequest)
   return
  }

  cacheKey := fmt.Sprintf("result_%d", n)
  cachedResult, found := safeCache.Get(cacheKey)
  var result int
  if found {
   result = cachedResult.(int)
  } else {
   result = expensiveComputation(n)
   safeCache.Set(cacheKey, result, 1*time.Minute)
  }

  _, err = fmt.Fprintf(w, "Result: %d\n", result)
  if err != nil {
   return
  }
 })

 log.Fatal(http.ListenAndServe(":8080", nil))
}

結論

在本文中,我們展示了如何使用sync.Map包在Go中實現一個簡單、線程安全的緩存。

這個緩存實現支持基于TTL的過期的鍵值存儲,并可以輕松地集成到你的Go應用中,以提高性能并減少對你的數據源或計算資源的負載。

責任編輯:趙寧寧 來源: 技術的游戲
相關推薦

2024-12-03 08:53:46

Go語言類型

2021-05-18 09:03:16

Gomapslice

2025-02-12 08:50:22

2025-03-06 08:54:24

泛型類型MapGo1

2023-10-28 16:22:21

Go接口

2023-05-15 08:01:16

Go語言

2023-11-27 19:39:46

Goprotobuf

2024-05-27 09:35:04

C++線程安全Map

2012-06-05 09:54:50

Windows Pho

2023-12-25 09:58:25

sync包Go編程

2024-10-14 08:51:52

協程Go語言

2019-10-29 19:49:48

Java線程安全

2023-03-21 09:07:38

HashMap線程安全

2024-11-14 11:29:38

2021-05-14 08:58:18

非線性安全Go

2024-04-07 00:04:00

Go語言Map

2025-11-17 01:41:00

2024-06-04 08:32:40

2021-11-29 22:59:34

Go Dockertest集成

2024-06-27 12:21:13

點贊
收藏

51CTO技術棧公眾號

欧美一级在线免费观看| 欧美极品视频在线观看| 日韩一区二区三区在线免费观看 | 日韩av片免费观看| 影音先锋男人在线资源| 99免费精品在线| 国产精品美乳一区二区免费| 麻豆精品一区二区三区视频| 亚洲制服欧美另类| 日韩一区二区免费在线电影| 欧美在线免费观看| 国产精品国产三级国产专业不| 五月天色综合| 疯狂做受xxxx高潮欧美日本| 三年中文高清在线观看第6集| 神马久久久久久久久久| 狠狠色丁香婷婷综合久久片| 青草成人免费视频| 天天看片中文字幕| 欧美色图国产精品| 亚洲国产另类久久精品| 久久久久xxxx| 在线成人视屏| 欧美日韩免费一区| 日本天堂免费a| 在线视频自拍| 国产亚洲一区二区在线观看| 国产精品区一区| 99精品在线看| 麻豆精品一区二区三区| 欧美在线不卡区| 亚洲精品在线视频免费观看| 久久香蕉一区| 国产精品久久久久久户外露出| 日韩美女视频免费看| 免费一级片在线观看| 日韩免费视频| 一个人www欧美| 欧美大片免费播放器| 免费观看性欧美大片无片| 欧美视频中文一区二区三区在线观看| 精品国产免费av| 国产91足控脚交在线观看| 中文字幕亚洲一区二区va在线| 欧洲精品久久| 九九在线视频| 久久婷婷成人综合色| 激情欧美一区二区三区中文字幕| www.成人精品| 国产精品中文有码| 亚洲一区二区三区视频播放| 中文字幕av久久爽| 日韩精品亚洲专区| 久久久999精品| 最好看的中文字幕| 欧产日产国产精品视频| 一个色综合网站| 麻豆av一区二区三区久久| 高清一区二区三区四区| 成人一道本在线| 国产精品日韩一区二区| 精品人妻av一区二区三区| 国产精品综合在线视频| www日韩av| 丰满熟妇乱又伦| 成人av资源网站| 国产精品流白浆视频| 中文字幕一级片| 精品一区二区在线看| 久久久欧美一区二区| 国产无遮挡又黄又爽| 在线亚洲精品| 国产精品69av| 一级黄色大毛片| 国产精品一区二区不卡| 国产精品美女诱惑| 秋霞av在线| 亚洲国产电影在线观看| 一区二区在线不卡| 黄页网站在线观看免费| 欧美体内谢she精2性欧美| 狠狠热免费视频| 自拍偷拍亚洲| 亚洲第一精品夜夜躁人人爽| 97超碰在线资源| 国产精品x453.com| 欧美精品videosex极品1| 中文字幕69页| 国产美女av一区二区三区| 国产一区国产精品| 国产农村妇女毛片精品| 成人精品高清在线| 日韩精品一线二线三线| 男女在线观看视频| 91成人免费在线视频| 性色av浪潮av| 国产精品一国产精品| 久久综合电影一区| 久久精品国产成人av| 极品少妇xxxx精品少妇偷拍| 精品欧美一区二区久久久伦| 免费**毛片在线| 精品国产乱码久久久久久虫虫漫画 | 91麻豆桃色免费看| 少妇人妻精品一区二区三区| 国产精品久久久久久久久快鸭| 免费人成自慰网站| 国产亚洲精彩久久| 亚洲精品videossex少妇| 亚洲女人久久久| 国产日韩视频在线| 久久69精品久久久久久久电影好| 免费看一级视频| 国产成人精品亚洲日本在线桃色| 亚欧精品在线| 涩涩视频网站在线观看| 日韩精品一区二区三区在线 | 国产精品www网站| 国 产 黄 色 大 片| 国产精品福利电影一区二区三区四区| 精品久久一二三| 亚洲视频三区| 成人97在线观看视频| 中文av免费观看| 久久无码av三级| 日本a视频在线观看| 美女精品视频在线| 日韩在线观看免费网站 | 欧美日产一区二区三区在线观看| 色老头在线观看| 一区二区三区四区在线| 第四色婷婷基地| 国产精品亚洲片在线播放| 51视频国产精品一区二区| 亚洲国产999| 亚洲美女屁股眼交3| 老司机久久精品| 欧美亚洲高清| 国产精品极品尤物在线观看| 免费在线视频你懂得| 欧美日韩国产在线播放| 亚洲婷婷在线观看| 影音先锋国产精品| 国产精品久久精品视| 性直播体位视频在线观看| 91精品国产免费久久综合| 欧美一级特黄高清视频| 久久99日本精品| 最新精品视频| 玖玖玖视频精品| 欧美美最猛性xxxxxx| 精品人妻无码一区二区三区蜜桃一 | 久久久久久网| 日韩在线三区| 国语自产精品视频在线看抢先版结局 | 黄色成人av在线| 精品中文字幕在线播放| 亚洲免费一区二区| 欧美日韩精品一区| 在线成人视屏| 日韩视频免费中文字幕| 精品国产999久久久免费| 亚洲一区二区三区视频在线播放| 老熟女高潮一区二区三区| 怡红院精品视频在线观看极品| 黄色小网站91| a∨色狠狠一区二区三区| 日韩亚洲国产中文字幕| 精品久久国产视频| 精品欧美激情精品一区| 天天躁夜夜躁狠狠是什么心态 | 韩国三级在线播放| 亚洲国产精品一区| 欧美日韩综合精品| 欧美一区二区三区婷婷| 久久91超碰青草是什么| 无码精品一区二区三区在线| 色婷婷av久久久久久久| 香蕉视频xxx| 另类尿喷潮videofree| 欧美综合激情网| 精品自拍一区| 亚洲第一页自拍| 午夜视频网站在线观看| 亚洲欧美一区二区三区国产精品| 亚洲精品激情视频| 日本欧美一区二区三区乱码| 2021国产视频| 四虎国产精品免费久久| 久久久久久久久久久国产| 久久米奇亚洲| 精品少妇一区二区三区在线播放| 成人午夜淫片100集| 国产精品久久福利| 老司机免费视频| 免费成人在线观看视频| 日本一区午夜艳熟免费| 区一区二视频| 国产一区二区三区四区hd| 免费视频观看成人| 欧美怡春院一区二区三区| 在线观看免费视频你懂的| 亚洲欧洲中文天堂| 韩国av永久免费| 欧美顶级少妇做爰| 欧美 日韩 精品| 一区二区三区高清不卡| 538精品视频| 26uuu国产在线精品一区二区| 波多野结衣国产精品| 久久一综合视频| 欧美综合在线播放| 在线看片不卡| 少妇特黄a一区二区三区| 久久97久久97精品免视看秋霞| 成人免费午夜电影| 成人视屏在线观看| 91av在线免费观看| 啪啪免费视频一区| 不卡av日日日| yes4444视频在线观看| 欧美性做爰猛烈叫床潮| 国产在线视频卡一卡二| 亚洲人成人一区二区在线观看| 国产精品成人无码免费| av成人免费在线| 亚洲AV成人精品| 国产精品系列在线播放| 五月婷婷六月合| 日韩电影在线观看网站| 99热在线这里只有精品| 在线成人欧美| 精品人妻大屁股白浆无码| 亚洲成人精选| 91免费视频黄| 香蕉国产精品| avove在线观看| 亚洲色图插插| 欧美大片免费播放| 一区二区中文| 成人在线免费观看视频网站| 亚洲一区二区三区| 中文字幕一区二区三区在线乱码| 久久视频在线| 99热一区二区三区| 午夜激情一区| www插插插无码免费视频网站| 欧美一区综合| 免费在线黄网站| 亚洲特色特黄| 日本手机在线视频| 国产日韩一区| 日韩中文字幕免费在线| 日本成人在线电影网| 日本美女视频一区| 国产精品1区2区3区在线观看| 国产伦理在线观看| aaa国产一区| 伊人网伊人影院| 中文字幕精品—区二区四季| 少妇高潮一区二区三区喷水| 亚洲欧美另类图片小说| 国产小视频在线观看免费| 久久精品夜色噜噜亚洲aⅴ| 国产ts丝袜人妖系列视频| 国产一区福利在线| 99精品视频播放| 视频一区中文字幕国产| 日本美女高潮视频| 久久国内精品自在自线400部| 国产农村妇女精品久久| 成人av在线播放网址| 女尊高h男高潮呻吟| 国产精品一区三区| 中文字幕人妻一区| 久久先锋影音av鲁色资源网| 蜜桃av免费观看| 亚洲精品国产精华液| 日本午夜小视频| 精品视频资源站| 精品人妻无码一区二区| 日韩激情在线视频| 一区二区高清不卡| 久久人人爽国产| a成人v在线| 成人资源视频网站免费| 九一精品国产| 免费观看中文字幕| 国产精品视区| 五月天国产视频| 国产喂奶挤奶一区二区三区| 国产suv精品一区二区68| 亚洲成人精品影院| 中文字幕av资源| 亚洲精品国产综合久久| 久草中文在线| 日本成人在线视频网址| 奇米一区二区| 欧美久久在线| 国产一区二区三区四区三区四 | 免费一级黄色大片| 在线观看亚洲a| 欧美在线 | 亚洲| 日韩中文理论片| 中文字幕高清在线播放| 欧美国产日韩精品| 日本欧美一区| 国产综合av一区二区三区| 久久亚洲国产| 日韩 欧美 高清| 成人免费视频一区| 91n在线视频| 色呦呦网站一区| 三级网站在线看| 色综合色综合久久综合频道88| 美女色狠狠久久| 蜜桃av噜噜一区二区三| 欧美天天视频| 少妇人妻在线视频| 极品销魂美女一区二区三区| 欧美黄色一级生活片| 亚洲第一狼人社区| 精品国产999久久久免费| 日韩视频在线免费观看| 国产综合色区在线观看| 久久视频在线观看中文字幕| 国产综合自拍| 人妻精品久久久久中文字幕69| 亚洲欧洲美洲综合色网| 久久精品五月天| 亚洲色无码播放| 中文字幕一区久| 精品一区2区三区| 亚洲人成久久| 日本黄色动态图| 午夜精品久久久久久久99樱桃| 性一交一乱一精一晶| 欧美精品亚州精品| 日韩免费一级| 欧美乱做爰xxxⅹ久久久| 国产精品性做久久久久久| 欧美日韩中文字幕在线观看| 5月丁香婷婷综合| 精品欧美色视频网站在线观看| 国产日产久久高清欧美一区| 日本a口亚洲| 网站在线你懂的| 中文字幕一区二区三区四区不卡| 中文在线资源天堂| 视频直播国产精品| 在线播放成人| 9191国产视频| 成人国产视频在线观看| 国产成人在线免费观看视频| 欧美日韩精品是欧美日韩精品| 成人网视频在线观看| 国产日韩中文在线| 香蕉av一区二区| 无码人妻aⅴ一区二区三区玉蒲团| 亚洲综合久久久| 天天综合网天天综合| 茄子视频成人在线| 国产精品不卡| 欧美午夜精品一区二区| 天天色 色综合| 美女欧美视频在线观看免费| 国产精品入口免费视频一| 忘忧草精品久久久久久久高清| 日韩av影视大全| 黄色成人av在线| 91高清在线视频| 亚洲一区二区三区香蕉 | 亚欧在线免费观看| 中文字幕一区二区三中文字幕| 亚洲av无码一区二区三区性色| 欧美一区视频在线| 欧美a级成人淫片免费看| 中文字幕 欧美 日韩| 天天综合色天天| av网站无病毒在线| 97中文在线观看| 久久国产主播| 欧美黑人一级片| 亚洲欧美国产日韩天堂区| 成年永久一区二区三区免费视频 | 日本孕妇大胆孕交无码| 韩国精品一区二区三区六区色诱| 日韩国产欧美三级| 青青操国产视频| 亚洲天堂男人天堂| 蜜桃av.网站在线观看| 四虎影院一区二区三区| 国产精品一区二区久激情瑜伽| 中文字字幕在线中文| 久久视频在线看| 久久av影视| 中文字幕一区二区三区人妻在线视频 | 国产亚洲欧美日韩精品| 综合欧美亚洲| 美女网站色免费|