相親交友原始碼開發,關於分散式快取應該瞭解的一些事
快取的更新模式
// Read data = cache.get(id); if (data == null) { data = db.get(id); cache.put(id, data); } // Write db.save(data); cache.invalid(data.id);
Thread-A: Write DB Version(A) Thread-B: Write DB Version(B) Thread-B: Write Cache Version(B) Thread-A: Write Cache Version(A) -- 資料庫結果是B,快取裡面變成A了
Thread-A: Write DB Version(A) Thread-B: Write DB Version(B) Thread-B: Expire Cache Thread-A: Expire Cache -- 兩種情況只失效快取,下次讀操作會把db的最新值重新整理到快取中。
# [xxx] 表示一個元件 # 箭頭表示資料方向 Read: Client <-- [Cache <-- DB]Write:Client --> [Cache --> DB]
快取失效策略
快取淘汰策略
分散式快取的常見問題
# 我們先看看最簡單的青銅姿勢 value = cache.get(key) if value is None: value = db.get(key) # 由於value為空,實際上快取並沒有寫進去,一旦這個key成為熱點,db的壓力將會極大 cache.put(key, value, expire) return value else: return value # 簡單優化一下,升級成為白銀姿勢 wrapped_value = cache.get(key) if wrapped_value is None: value = db.get(key) # 即使是空物件也通過包裝物件放到快取,當然考慮到空間還可以採用特殊值(比如-1代表不存在)的方式 cache.put(key, wrapped_value(value), expire) return wrapped_value.value else: return wrapped_value.value
# 白銀姿勢 wrapped_value = cache.get(key) if wrapped_value is None: value = db.get(key) # 在寫入快取之前,大量的請求突然湧入,db瞬間被打垮 cache.put(key, wrapped_value(value), expire) return wrapped_value.value else: return wrapped_value.value # 在白銀姿勢的基礎上我們再優化成黃金姿勢 wrapped_value = cache.get(key) if wrapped_value is None: # 查db之前加一把鎖 while wrapped_value is None: if try_lock(key): value = db.get(key) cache.put(key, wrapped_value(value), expire) return wrapped_value.value else: # 等待10毫秒之後重試 sleep(0.01) wrapped_value = cache.get(key) return wrapped_value.value else: return wrapped_value.value
# 通過隨機失效時間登上王者姿勢 wrapped_value = cache.get(key) if wrapped_value is None: # 查db之前加一把鎖 while wrapped_value is None: if try_lock(key): value = db.get(key) # 嗯,就是一個隨機失效時間,最好是在某個區間 cache.put(key, wrapped_value(value), random_expire()) return wrapped_value.value else: # 等待10毫秒之後重試 sleep(0.01) wrapped_value = cache.get(key) return wrapped_value.value else: return wrapped_value.value
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2838820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 相親交友原始碼開發,前端API如何請求快取?原始碼前端API快取
- 相親交友原始碼實現程式內快取,提升高併發能力!原始碼快取
- 相親交友原始碼中的事件循壞,你瞭解多少?原始碼事件
- 相親交友原始碼開發中,Redis的三種限流方式原始碼Redis
- 相親交友原始碼開發,前端如何實現水印功能?原始碼前端
- 如何解決相親交友原始碼中Redis快取擊穿、雪崩問題?原始碼Redis快取
- 關於相親原始碼的監控系統搭建,你瞭解多少?原始碼
- 編寫相親交友原始碼,註釋方面應該重視哪些問題?原始碼
- 關於分散式快取memcache分散式快取
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- 相親交友原始碼開發中會用到的幾種日期處理方法原始碼
- 相親交友原始碼開發,演算法的定義及複雜度分析原始碼演算法複雜度
- 關於JavaScript的作用域你應該瞭解的那點事!JavaScript
- 開發相親交友原始碼,需要熟練掌握的音視訊基礎知識原始碼
- 相親交友原始碼實現相親直播間,移動終端的優化方案原始碼優化
- 一文解讀伊對相親交友app原始碼功能特色、應用場景APP原始碼
- Masa Framework原始碼解讀-02快取模組(分散式快取進階之多級快取)Framework原始碼快取分散式
- 如何實現相親交友原始碼的CPU效能優化?解決方案梳理原始碼優化
- 搭建相親交友原始碼 ,API 介面統一格式返回的實現原始碼API
- 影片相親交友系統開發,引領婚戀交友新玩法
- 關於大資料你應該瞭解的五件事兒大資料
- 相親交友原始碼前端效能優化,通常使用哪些手段?原始碼前端優化
- 關於工業物聯網,你應該瞭解的3件事
- 相親交友 系統開發找哪家好?交友軟體的發展潛力如何?
- 關於GCD開發的一些事GC
- 關於Web開發,每個程式設計師都應瞭解的那些事Web程式設計師
- 關於分散式事務的理解分散式
- 搞懂分散式技術13:快取的那些事分散式快取
- 分散式快取 - 概念解釋分散式快取
- 關於MySQL密碼你應該知道的那些事MySql密碼
- 關於 MySQL 密碼你應該知道的那些事MySql密碼
- 關於spring事務原始碼的一些小理解Spring原始碼
- 婚戀交友原始碼開發,關於API介面安全性問題的思考原始碼API
- 分散式快取分散式快取
- Seata分散式事務TA模式原始碼解讀分散式模式原始碼
- 應對分散式快取當機的方案分散式快取
- 關於Git小白應該知道的事Git
- 微信開發相關,瞭解一下