精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

jizzzz日本| 亚洲欧美久久久久一区二区三区| 日本a在线观看| 国产精品免费大片| 91麻豆精品国产91久久久使用方法 | 欧美精品久久96人妻无码| 丰满人妻一区二区三区四区53| 可以看av的网站久久看| 欧美另类极品videosbest最新版本| 一级黄色片毛片| a∨色狠狠一区二区三区| 亚洲一区二区三区自拍| 日韩欧美一区二区三区久久婷婷| www.天天干.com| 欧美aaaaa成人免费观看视频| 欧美xxxx18国产| 亚洲色成人网站www永久四虎 | 欧美久久久久久蜜桃| 久久精品视频16| 麻豆视频网站在线观看| 久久你懂得1024| 国产高清自拍一区| 国产精品日韩无码| 日韩高清中文字幕一区| 97婷婷大伊香蕉精品视频| 北条麻妃在线观看视频| 国产一区二区在线| 亚洲国产精彩中文乱码av在线播放 | 男女羞羞在线观看| 一区二区三区中文字幕| 一区二区三区四区国产| 久久精品蜜桃| 91丨国产丨九色丨pron| 高清国产在线一区| 午夜精品久久久久久久99热黄桃| 免费看欧美美女黄的网站| 日本国产精品视频| 日韩精品在线免费视频| 影音先锋久久资源网| 欧美日本中文字幕| 国产天堂av在线| 希岛爱理一区二区三区| 中文字幕日韩电影| 欧美一区二区三区粗大| 精品日韩毛片| 在线看国产精品| 一区二区三区四区免费| 美女精品一区最新中文字幕一区二区三区| 欧美v国产在线一区二区三区| 色男人天堂av| 精品国产三区在线| 欧美一区二区女人| 在线观看免费看片| а√中文在线天堂精品| 亚洲精品一线二线三线无人区| 国产大尺度视频| 粉嫩的18在线观看极品精品| 亚洲第一色中文字幕| 日韩av无码一区二区三区不卡| 成人在线视频中文字幕| 亚洲成人xxx| 网站免费在线观看| 国产一区二区三区四区大秀| 在线国产精品视频| 波多野结衣亚洲一区二区| 亚洲激情久久| 欧美国产日韩在线| 中文字幕日韩一级| 午夜综合激情| 国产精品视频精品| 99精品久久久久久中文字幕| 国产精品一二三四| 国产精品国产精品| 免费在线高清av| 国产精品欧美极品| 国产激情片在线观看| 黄色漫画在线免费看| 日本久久电影网| 五月天视频在线观看| 亚洲一区二区三区在线免费| 精品视频在线导航| 国产亚洲精品久久久久久豆腐| 中文字幕一区二区三区乱码图片 | 99久久精品国产一区| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 欧美一区二区三区婷婷| 日韩你懂的在线播放| 亚洲精品女人久久久| 国产精品99久久久久久动医院| 欧美激情手机在线视频 | 国产二区国产一区在线观看| 国产日韩欧美一区二区| 成人性爱视频在线观看| 又紧又大又爽精品一区二区| 日韩av黄色网址| 日韩黄色三级在线观看| 亚洲福利视频网站| 999精品视频在线观看播放| 亚洲国产午夜| 国产又爽又黄的激情精品视频| 日本高清视频免费看| 国产精品卡一卡二| 精品欧美一区免费观看α√| 中文成人在线| 亚洲夜晚福利在线观看| 国产在线综合网| 国内久久精品视频| 欧美日韩一区二区三| 免费看电影在线| 欧美男男青年gay1069videost| 亚洲の无码国产の无码步美| 欧美一区成人| 国产精品91在线观看| 五月天婷婷在线播放| 亚洲三级电影网站| 亚洲一级免费在线观看| 日韩有码中文字幕在线| 欧美猛交免费看| 国产精品玖玖玖| 国产婷婷色一区二区三区四区| 国产手机免费视频| 欧美三级一区| 日韩日本欧美亚洲| www.久久网| 久久精品欧美一区二区三区麻豆 | 老熟妻内射精品一区| 天堂资源在线中文精品| 国偷自产av一区二区三区小尤奈| 哥也色在线视频| 欧美日韩精品免费| www.黄色在线| 日韩精品午夜视频| 欧美日韩精品久久| 中文字幕在线看片| 亚洲国产精品美女| 国产无遮挡又黄又爽又色| 国产成人精品免费视频网站| 亚洲小视频在线播放| 日韩成人精品一区二区三区| 色小说视频一区| 中文文字幕一区二区三三| 久久久国产一区二区三区四区小说 | 久久久国产精华液| 国产高清精品久久久久| 精品无码av无码免费专区| 久久丁香四色| 久久99国产精品久久久久久久久| av综合在线观看| 亚洲精选在线视频| 白丝校花扒腿让我c| 狠狠入ady亚洲精品经典电影| 99re在线观看视频| wwww在线观看免费视频| 亚洲国产小视频| 丰满少妇xoxoxo视频| 欧美经典一区二区| 九九热99视频| 午夜久久99| 国产日韩欧美一区二区三区四区| а√天堂8资源中文在线| 日韩精品极品视频| 伊人久久久久久久久久久久| 国产欧美日韩精品在线| www.成年人| 国产精品www.| 久久本道综合色狠狠五月| 日韩欧美看国产| www亚洲欧美| 噜噜噜久久,亚洲精品国产品| 欧美日韩在线看| 欧美成人久久久免费播放| 狠狠网亚洲精品| 国产成人永久免费视频| 香蕉久久99| 国产在线a不卡| 国产在线xxx| 国产亚洲人成网站在线观看| 国产美女精品视频国产| 亚洲成人资源在线| 第一次破处视频| 国产一区二区精品在线观看| 精品国产一区三区| 日韩精品欧美| 国产三级精品在线不卡| 国精产品一区一区三区四川| 久久成人人人人精品欧| 桃花色综合影院| 6080午夜不卡| 性色av免费观看| 亚洲卡通欧美制服中文| 久久精品国产亚洲av麻豆| 国模无码大尺度一区二区三区| 日本福利视频一区| 色狮一区二区三区四区视频| 国产精品视频在线免费观看| 日韩不卡免费高清视频| 久久91亚洲人成电影网站| 成人jjav| 日韩电影视频免费| av网站在线免费看| 欧美在线小视频| 亚洲 欧美 日韩 综合| 亚洲女同一区二区| 欧美性猛交xxxx乱| 成人ar影院免费观看视频| 日本在线播放一区二区| 亚洲一区欧美激情| 野外做受又硬又粗又大视频√| 日韩欧美1区| 欧美一区二区福利| 国产精品毛片av| 91在线精品观看| 久久精品国产福利| 国产激情综合五月久久| 欧美13videosex性极品| 欧美大成色www永久网站婷| 黄色片在线播放| 亚洲精品久久久久国产| www.看毛片| 欧美一区二区三区人| 夜夜骚av一区二区三区| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩亚洲国产另类| 日韩一区中文字幕| 国产日韩精品中文字无码| 久久精品一二三| 人妻少妇精品视频一区二区三区| 成人永久看片免费视频天堂| 波多野结衣网页| 九色综合狠狠综合久久| 国产精品自拍视频在线| 日本不卡不码高清免费观看| 日韩一级在线免费观看| 免播放器亚洲| 狠狠97人人婷婷五月| 99riav1国产精品视频| 老太脱裤子让老头玩xxxxx| 韩国亚洲精品| 日韩视频免费播放| 91久久久久| 免费在线观看视频a| 激情另类综合| 少妇无码av无码专区在线观看| 国模一区二区三区| 日本一本中文字幕| 亚洲二区精品| 狠狠97人人婷婷五月| 老鸭窝91久久精品色噜噜导演| 干日本少妇首页| 丝瓜av网站精品一区二区| 国产成人综合一区| 免费看日韩精品| 日本亚洲一区二区三区| 成人亚洲精品久久久久软件| 一本色道久久hezyo无码| av电影在线观看一区| 一起草在线视频| 久久久不卡网国产精品二区| 少妇av片在线观看| 专区另类欧美日韩| 麻豆国产尤物av尤物在线观看| 亚洲一区二区三区四区在线观看 | 亚洲av鲁丝一区二区三区| 一区二区三区在线视频观看58 | av中文字幕在线播放| 欧美精品www在线观看| 美女扒开腿让男人桶爽久久软| 秋霞成人午夜鲁丝一区二区三区| 视频精品导航| 亚洲字幕在线观看| 精品深夜福利视频| 日韩一二三区不卡在线视频| 在线国产一区| 自拍日韩亚洲一区在线| 日产国产欧美视频一区精品| 日韩欧美中文视频| 99精品视频在线免费观看| 日本人亚洲人jjzzjjz| 亚洲精品视频在线观看免费| 91蜜桃视频在线观看| 欧美色区777第一页| 亚洲乱码在线观看| 亚洲欧美日本另类| 中文字幕有码在线视频| 国产97在线观看| 国产精区一区二区| 欧美日韩另类丝袜其他| 亚洲成av人片乱码色午夜| 国产二级片在线观看| 久久精品国产在热久久| 中文字幕a在线观看| 中文字幕一区日韩精品欧美| 国产成人无码精品久在线观看| 欧美日韩中文字幕一区| 欧美一级免费片| 色婷婷成人综合| 欧美成人h版| 成人资源视频网站免费| 日韩黄色大片| 美女av免费在线观看| 国产精品中文欧美| 免费看91的网站| 都市激情亚洲色图| 国产v片在线观看| 中文字幕九色91在线| 黄在线观看免费网站ktv| 91网站在线看| 成人影视亚洲图片在线| 亚洲欧洲日产国码无码久久99| 国产精品自拍一区| 一本色道久久88| 在线一区二区三区| 亚洲av电影一区| 欧美日韩国产成人| **日韩最新| 婷婷四月色综合| 麻豆成人精品| 亚洲一区二区三区四区五区六区| 亚洲精品一二三四区| 亚洲一卡二卡在线| 亚洲人成电影在线播放| 久久男人av资源站| 国产欧美日韩视频一区二区三区| 一本到12不卡视频在线dvd| 亚洲精品久久久中文字幕| 久久久久久久av麻豆果冻| 成年人免费高清视频| 亚洲第一区第二区| 超碰在线99| 国产精品视频免费观看| 亚洲黄色毛片| 精品视频站长推荐| 亚洲高清不卡在线| 黄色小视频免费在线观看| 欧美国产视频日韩| caoporn成人| 国产一线二线三线女| 国产成人午夜视频| 久久久一区二区三区四区| 日韩免费观看高清完整版在线观看| 久操视频在线播放| 91精品免费看| 一区二区在线| 日本精品一二三| 亚洲成人在线观看视频| 手机看片福利永久| 51色欧美片视频在线观看| 日韩美女精品| 成人一区二区三| 中文在线一区二区 | 成人av观看| 日韩欧美精品一区二区三区经典 | 成人免费看片载| 亚洲成人你懂的| 欧美日韩在线中文字幕| 国产精品高潮呻吟视频| 欧美r级电影| 日本黄色www| 午夜亚洲国产au精品一区二区| 日韩在线视频免费| 日本精品免费一区二区三区| 欧美日韩伦理| 免费不卡av网站| 精品福利一区二区| 国产精品久久久久久久龚玥菲 | 国产精品久线观看视频| 国产模特av私拍大尺度| 久久久久久久久久亚洲| 久久99国内| 天天综合天天添夜夜添狠狠添| 亚洲精品五月天| 三级av在线播放| 成人国产精品一区二区| 亚洲视频福利| 色一情一交一乱一区二区三区| 欧美日本不卡视频| а√天堂资源官网在线资源| 日韩电影免费观看在| 国产99久久久精品| 久久久久久不卡| 欧美成年人视频| 久久av超碰| 99久久综合网| 欧美在线小视频| 91吃瓜在线观看| 性欧美.com| www.欧美色图| 97精品人妻一区二区三区香蕉 | 日本精品福利视频| 久久久国产午夜精品| 国产成人精品亚洲精品色欲| 青青草一区二区| 欧美激情aⅴ一区二区三区| 91网站免费视频| 精品国产成人系列| 色999久久久精品人人澡69| 久久精品国产精品亚洲色婷婷| 自拍偷拍欧美激情| 精品视频一二三| 精品日产一区2区三区黄免费 |