摘要:微服務化之緩存設計一為什么需要緩存緩存作為微服務化設計的一把利劍,解決了高并發大數據場景下的數據預讀能力,大大提高了服務的性能。緩存過期策略有三種定時過期定時同步刷新定時異步刷新。因此選擇遠程緩存。
微服務化之緩存設計 一、為什么需要緩存
緩存作為微服務化設計的一把利劍,解決了高并發、大數據場景下的數據預讀能力,大大提高了服務的性能。可以說緩存無處不在,但是真正使用好緩存并不是一件容易的事情。
本人目睹過很多緩存設計欠佳的項目,很多都沒有考慮一致性問題,甚至有的連最基本的防止雪崩的能力都沒有。
本文就個人經歷并結合自己的思考提煉了一些設計要點,目的就是讓大家可以更好的使用緩存,希望大家能有所收獲。
緩存的重要性不言而喻,接下來我們需要考慮緩存的技術選型。是選擇本地緩存,還是考慮遠程緩存?如果使用遠程緩存,是選擇Memcache還是Redis?本節主要解答這些疑問。
1、本地緩存
本地緩存的好處:1)成本低,包括硬件成本和維護成本;2)速度更快,相對遠程緩存少了一次網絡交互
本地緩存的弊端:1)一致性很難保證;2)多次預熱,對底層存儲有一定壓力(可以忽略,但是也作為一個分析項)
通過上述對比分析,當業務場景對一致性要求比較低的情況下可以優先考慮本地緩存。
2、MC or Redis ?
Redis適用場景:需要持久化,數據內容比較大,需要復雜的數據結構,有高可用的需求。
MC適用場景:純KV,數據量和并發量非常大,使用MC更合適。
1、緩存 淘汰or更新?
數據有變更時,到底是對緩存進行淘汰還是更新操作?
總結:
1)一般選擇淘汰緩存,任何場景都適用
2)在部分情形下,更新緩存可以提高性能(減少一次cache miss)
2、先操作 數據庫or緩存?
數據有變更時,是先操作數據庫還是先操作緩存?
先操作數據庫,后操作緩存:存在原子性問題
先set緩存,后操作數據庫:存在原子性問題
總結:先淘汰緩存,后操作數據庫
3、緩存過期策略
為什么需要為緩存設置過期時間,或者說什么場景下需要為緩存設置過期時間?
數據變更有兩種情況:1)可以收到數據變更的通知;2)無法感知數據變更。針對第一種情況,我們可以收到通知后,淘汰或者更新緩存。而第二種情況,就需要定時操作緩存。
緩存過期策略有三種:1)定時過期;2)定時同步刷新;3)定時異步刷新。
定時過期:會造成一次cache miss
定時同步刷新:更新緩存線程被阻塞,其他線程返回舊的緩存值。
定時異步刷新:緩存值異步更新,所有請求線程返回舊的緩存值。
從左到右,一致性降低,性能提高。
4、主從數據不一致優化
為提高數據庫的讀性能,我們在很多場景下都采用了讀寫分離。由于主從同步需要時間,所以在同步時間差內如果有讀請求,會導致不一致的情況。如果引入緩存,不一致的時間會更長。
有兩個優化方向:
1) 從庫同步完立即淘汰緩存,減小不一致的時間;
2) 從庫同步完成前,讀請求訪問主庫。
當然,該節主要是討論如何解決同步導致的不一致問題。如果使用場景對一致性要求不高的話,完全可以忽略,或者不做讀寫分離。
案例一:緩存第三方公司的天氣數據,供公司內部各個業務線使用。
1)由于第三方公司的數據是要付費的,所以在滿足需要的情況下,盡可能的減少調用次數。因此選擇遠程緩存。
2)天氣數據結構非常簡單,最普通的k-v存儲,MC完全滿足需要。
3)由于天氣數據來源于第三方,數據變更無法感知,所以采用緩存過期策略。
4)對一致性要求不高,因此采用性能最好的定時異步更新策略。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61727.html
摘要:微服務化之緩存設計一為什么需要緩存緩存作為微服務化設計的一把利劍,解決了高并發大數據場景下的數據預讀能力,大大提高了服務的性能。緩存過期策略有三種定時過期定時同步刷新定時異步刷新。因此選擇遠程緩存。 微服務化之緩存設計 一、為什么需要緩存 緩存作為微服務化設計的一把利劍,解決了高并發、大數據場景下的數據預讀能力,大大提高了服務的性能。可以說緩存無處不在,但是真正使用好緩存并不是一件容易...
摘要:本文會以引出問題為主,后面有時間的話,筆者陸續會抽些重要的知識點進行詳細的剖析與解答。敬請關注服務端思維微信公眾號,獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結合自己過往的面試經驗,整理了一些核心的知識清單,幫助讀者更好地回顧與復習 Java 服務端核心技術。本文會以引出問題為主,后面有時間的話,筆者陸續會抽些重要的知識點進...
摘要:淺談秒殺系統架構設計后端掘金秒殺是電子商務網站常見的一種營銷手段。這兩個項目白話網站架構演進后端掘金這是白話系列的文章。 淺談秒殺系統架構設計 - 后端 - 掘金秒殺是電子商務網站常見的一種營銷手段。 不要整個系統宕機。 即使系統故障,也不要將錯誤數據展示出來。 盡量保持公平公正。 實現效果 秒殺開始前,搶購按鈕為活動未開始。 秒殺開始時,搶購按鈕可以點擊下單。 秒殺結束后,按鈕按鈕變...
摘要:然而在微服務化之前,建議先進行容器化,在容器化之前,建議先無狀態化,當整個流程容器化了,以后的微服務拆分才會水到渠成。 此文已由作者劉超授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 一、為什么要做無狀態化和容器化 很多應用拆分成微服務,是為了承載高并發,往往一個進程扛不住這么大的量,因而需要拆分成多組進程,每組進程承載特定的工作,根據并發的壓力用多個副本公共...
閱讀 591·2021-11-15 11:38
閱讀 1174·2021-10-11 10:59
閱讀 3491·2021-09-07 09:58
閱讀 479·2019-08-30 15:44
閱讀 3518·2019-08-28 18:14
閱讀 2599·2019-08-26 13:32
閱讀 3514·2019-08-26 12:23
閱讀 2413·2019-08-26 10:59