相親交友原始碼實現程式內快取,提升高併發能力!
前言
快速入門
// 先初始化 local cache cache, err = collection.NewCache(time.Minute, collection.WithLimit(10)) if err != nil { log.Fatal(err) }
// 1. add/update 增加/修改都是該API cache.Set("first", "first element") // 2. get 獲取key下的value value, ok := cache.Get("first") // 3. del 刪除一個key cache.Del("first")
cache.Take("first", func() (interface{}, error) { // 模擬邏輯寫入local cache time.Sleep(time.Millisecond * 100) return "first element", nil })
解決方案
有限容量
熱點資料統計
func (c *Cache) Get(key string) (interface{}, bool) { value, ok := c.doGet(key) if ok { // 命中hit+1 c.stats.IncrementHit() } else { // 未命中miss+1 c.stats.IncrementMiss() } return value, ok }
多執行緒存取
// Set(key, value) func (c *Cache) Set(key string, value interface{}) { // 加鎖,然後將 <key, value> 作為鍵值對寫入 cache 中的 map c.lock.Lock() _, ok := c.data[key] c.data[key] = value // lru add key c.lruCache.add(key) c.lock.Unlock() ... } // 還有一個在操作 LRU 的地方時:Get() func (c *Cache) doGet(key string) (interface{}, bool) { c.lock.Lock() defer c.lock.Unlock() // 當key存在時,則調整 LRU item 中的位置,這個過程也是加鎖的 value, ok := c.data[key] if ok { c.lruCache.add(key) } return value, ok }
func (c *Cache) Take(key string, fetch func() (interface{}, error)) (interface{}, error) { // 1. 先獲取 doGet() 中的值 if val, ok := c.doGet(key); ok { c.stats.IncrementHit() return val, nil } var fresh bool // 2. 多協程中通過 sharedCalls 去獲取,一個協程獲取多個協程共享結果 val, err := c.barrier.Do(key, func() (interface{}, error) { // double check,防止多次讀取 if val, ok := c.doGet(key); ok { return val, nil } ... // 重點是執行了傳入的快取設定函式 val, err := fetch() ... c.Set(key, val) }) if err != nil { return nil, err } ... return val, nil }
總結
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2840438/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 相親交友原始碼開發,前端如何實現水印功能?原始碼前端
- 程式內快取助你提高併發能力!快取
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- 相親交友原始碼開發,前端API如何請求快取?原始碼前端API快取
- 如何解決相親交友原始碼中Redis快取擊穿、雪崩問題?原始碼Redis快取
- 相親交友原始碼實現相親直播間,移動終端的優化方案原始碼優化
- 相親交友原始碼開發,關於分散式快取應該瞭解的一些事原始碼分散式快取
- 如何實現相親交友原始碼的CPU效能優化?解決方案梳理原始碼優化
- 相親交友原始碼開發中,Redis的三種限流方式原始碼Redis
- 如何在相親交友原始碼中實現正方形驗證碼輸入框?原始碼
- 在相親交友原始碼中實現視訊連麥直播需要哪些步驟?原始碼
- 搭建相親交友原始碼 ,API 介面統一格式返回的實現原始碼API
- 相親交友原始碼中語音連麥的實現方式,值得一看原始碼
- 相親交友原始碼前端效能優化,通常使用哪些手段?原始碼前端優化
- 相親交友原始碼開發中會用到的幾種日期處理方法原始碼
- 相親交友原始碼中的事件循壞,你瞭解多少?原始碼事件
- 相親交友原始碼的架構設計,實現合成複用原則需要如何做?原始碼架構
- 相親交友原始碼開發,演算法的定義及複雜度分析原始碼演算法複雜度
- 開發相親交友原始碼,需要熟練掌握的音視訊基礎知識原始碼
- 相親交友原始碼第三方登入的實現及易擴充套件的達成原始碼套件
- 影片相親交友系統開發,引領婚戀交友新玩法
- 相親原始碼開發,從程式碼級別減少資料請求次數的實現原始碼
- 10種相親交友原始碼客戶端儲存方式,各有優缺點原始碼客戶端
- 編寫相親交友原始碼,註釋方面應該重視哪些問題?原始碼
- 相親交友 系統開發找哪家好?交友軟體的發展潛力如何?
- 一文解讀伊對相親交友app原始碼功能特色、應用場景APP原始碼
- 在相親原始碼開發中,如何實現圓角及特殊圓角的使用?原始碼
- 快取和併發快取
- myBatis原始碼解析-二級快取的實現方式MyBatis原始碼快取
- 一篇文章簡析伊對影片相親交友app原始碼功能贏利點APP原始碼
- 相親原始碼開發,使用了哪些設計模式來優化業務程式碼?原始碼設計模式優化
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- Java 併發程式設計:ThreadLocal 的使用及其原始碼實現Java程式設計thread原始碼
- 實現SpringBoot + Redis快取的原始碼與教程Spring BootRedis快取原始碼
- 直播間原始碼,透過Redis實現資料快取原始碼Redis快取
- Lfu快取在Rust中的實現及原始碼解析快取Rust原始碼
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- 併發程式設計之 原始碼剖析 執行緒池 實現原理程式設計原始碼執行緒