三高項目-緩存設計

三高項目-緩存設計

分流、并發

導流:將原本復雜操作的請求,引導到簡單的操作上。以后再來查,不需要經過復雜的計算。

成本:空間,收益:節省了時間。

不要以為僅僅是 redis,map等。

對應。kv值。

1計算k,2 查詢k,3 得到值,做轉換。

如果能做好對應,最好,做不好對應呢? 命中率。沒有命中的緩存,查原數據。

數據的查詢時間:時間(123)+(1-命中率p)*查原數據的時間。

命中率=緩存中能查到的數據/數據庫總數據

如何 提升緩存的收益:

減少 123時間。

提高命中率(*)。

應用場景:

讀多寫少用緩存。

查詢原數據時間特別長的場景。

Key

鍵K有關

生成時間

不同功能業務的,key值要不一樣,否則會被覆蓋。

要唯一,避免碰撞。

單向函數:hash。給定輸入的情況下,很容易計算出結果,而給定結果的情況下,幾乎不可能計算出輸入值。

一般不存在。正向快速,逆向困難,輸入敏感,沖突避免。


md4 , md5,sha-0,sha-1,sha-2(用)


查詢時間

緩存的位置。內存,硬盤,本地。

數據結構。

1234567890

234567890-

equals,hashcode。

鍵總結

無碰撞(唯一),高效生成(不需要,約定好),高效比較。

系統標識+功能標識+業務標識+前后綴。

13910712345+vcode: 123456

公司統一標準。

序列化值(二進制),對象值。

數據污染:

0-0.5-1 1-2 存的不是最終值


緩存只是 在 調用方和 數據提供方之間的一個 暫存方。

統一:緩存中數據怎么來的,查詢的時候,如果沒有,就從數據提供方獲取,然后放到緩存中。

緩存的更新機制

時效性更新機制

固定時間過期,被動更新

:緩存中的數據設置一個過期時間。如果緩存數據過期,那么,我會去提供方查詢,這樣就相當于將 提供方 的數據 更新到緩存中了。

放棄了:實時一致性。(商品關注人數,評論數,瀏覽量,評論點贊收藏)

讀,

寫:只寫數據提供方。不理會緩存。

主動更新機制

清風:cap。

cache aside

寫:先更新,更新數據提供方,刪除緩存。

概率很低:

1。 讀的時候,緩存里 沒有數據。

2。 讀的時候,有寫在同時進行。

3。讀的時長大于 寫操作。(不那么容易發生 1%)。

4。 讀寫操作 同時發生時,讀到的是舊值。50%。

可以用。鴕鳥算法。

在計算機科學中,鴕鳥算法?是一個忽略潛在問題的一種算法策略,這種策略對計算機程序可能出現的問題采取無視態度(類似于鴕鳥在遇到危險時將頭埋在地里,裝作看不見)。鴕鳥算法的使用前提是,問題出現的概率很低。

三高項目-緩存

雙寫一致性

先刪除緩存,再更新數據提供方。 延遲雙刪。

1。更新緩存,更新數據庫。更容易造成數據的不一致,緩存成功,數據提供方失敗。更糟糕。

2。更新數據庫,更新緩存。有缺點,一點點稍微可取。

缺點:A 更新了數據庫。B更新了數據庫,B更新了緩存,A更新了緩存。

空干活,經過復雜的計算,給緩存設置值,但是用的少,浪費了資源。

3。刪除緩存,更新數據庫。延遲雙刪

4。更新數據庫,刪掉緩存。上節課所說的額cache aside。

延遲雙刪:刪除緩存,更新數據提供方,睡眠一段時間(根據實際業務),再刪除緩存。

如果第二次 刪除失敗了,怎么辦? 重試一下。

自己寫重試代碼,沒問題。自己掛了呢?

轉移風險。重試的組件? 消息隊列。

上面所說的,不管方案多么復雜,完善,總不能保證一致性。

Read/Write Through

直接 將 結果寫入緩存。再從緩存 同步到數據提供方。調用方只需要和緩存交互。

寫成功標識:緩存成功,數據提供方成功。TCC。

初始化:1。 啟動緩存,從數據提供方,初始化。2。讀取緩存 ,初始化。

緩存預熱。命中率低,慢慢的命中率才高。

保障:緩存 非常 可靠。

Write Behind

在上面 做了升級,異步寫入到數據提供方。加入消息隊列,保證最終一致性。


緩存空間足夠大,能緩存所有的數據,命中率 100%。

清理機制

以提高緩存命中率為目標。

過去訪問多的,未來訪問也多。

最近被更新的,未來訪問的多。

時效性清理

過期全部清理。要求緩存中的數據都有一個生存期,有效期。

1條數據:data,ttl。2min。

輪詢時效清理:額外開啟一個程序,定期掃描所有數據的有效期,到期了,干掉。

自動時效清理:cookie。本質:上面的 輪詢。

數目閾值清理

1 條數,2 每條的大小。

FIFO: 隊列大小是10,

LRU:左神算法。數據訪問次數,頭部,刪尾部。

LinkedHashMap 都可以實現 fifo,lru。

如果空間充足,則緩存多多的,提高命中率。如果空間不夠,再回收空間,把空間給其他人讓出來。

垃圾回收。

強引用:只要被強引用,就不會被回收。內存不足時,哪怕自己掛掉,也不回收。

軟引用:空間不足時,才會被回收。

弱引用,虛引用。

SoftReference。 java實現它。

用java實現一個 根據內存空間大小的使用情況,做一個緩存組件。

Map?<k,SoftReference<>>。

實戰:

時效性清理+數據閾值式= 1。過期就干掉。2,密集查詢,導致空間急劇增大。

LRU+軟引用:保證最近用的數據在,然后最近不用的,放到軟引用里,用軟引用包裝一下。

不建議:只用軟引用。緩存的存活與否,從業務逃脫。業務控制不了。


三高項目

緩存風險點

每增加一個環節,就多一個風險。

緩存穿透

緩存沒有數據,數據提供方也沒有數據,穿透了。

無效的調用,增加數據提供方的壓力,緩存基本無效。

解決方案:在緩存中,緩存一份 空數據。key有值,value為空。

緩存雪崩

大量緩存突然失效,引發的數據提供方壓力 驟增。

數據閾值式清理:(緩存是逐個失效的)閾值比較低的時候會。10個緩存。閾值高,可以緩解。

時效式清理:會造成雪崩。避免緩存在同一時刻失效。過期時間=固定值+隨機值。錯峰失效。

軟引用清理:當空間緊張的時候,緩存占據的空間會被回收。單純的軟引用無法解決。lru:對經常訪問的數據建立強引用。

緩存擊穿

有數據提供方 兜底,不叫穿透。

lru:高頻訪問的數據,大概率在前面 fifo。

read/write through, write behind。更新機制。緩存里有沒有?因為數據的寫、更新,先操作的是緩存。

cache aside: 有一個節點,緩存被刪除。可能有擊穿。

實際工作:

清理機制+更新機制,針對緩存,共同考慮。

緩存預熱

啟動系統的時候,提前加載一些數據。預加載。

緩存服務啟動后,腳步直接灌入。init

時效式清理機制:緩存重復預熱。

緩存的位置

需要緩存的數據,一定要靠前。。要想系統性能好,緩存一定要趁早。

前置模塊:減少和后端通信的成本。

后置模塊:公共模塊,盡量用這個方式。

客戶端緩存

客戶端:瀏覽器,c軟件,安卓,ios,h5,小程序。

瀏覽器:cookie,過期時間。輕量級的緩存。

F12 application。h5支持 & 瀏覽器的支持。

sqlite :安卓端的一個數據庫。規則類。開機圖片,引導頁。

cdn 靜態緩存

靜態資源:頁面,圖片。

數據:重點:地名,字典,行業分類,統計局 那些標準化的數據。三級聯動。算。廣義:與用戶個體無關的具有通用性的數據,都可以作為靜態數據。

數據:用戶不同,參數不同,時間不同,----結果不同。 對系統性能造成負面影響。

服務端緩存

redis。localcache,guava。

數據庫緩存

冗余字段,中間表

操作完業務,需要做統計,非實時的數據,讓它后置。

新增訂單:

insert order (xxxxxx), 統計表 (訂單數據 + 1) 10s。

5s, 定時任務掃描(48h-24h) +10。

冗余字段:

訂單表(商品的數據)快照。

三高項目

寫緩存

讀緩存。調用方 數據提供方。

寫緩存:調用方和 數據 處理方之間。目的:減少巨量調用操作對數據處理方的沖擊。庫存。削峰。

消息隊列。

寫緩存收益:原始時間 <(寫緩存時間+緩存中數據向后傳遞的時間+原始時間)

收益在于用戶的角度:目標用戶的響應時間 降低了。

讀緩存:是以緩存命中的數據 替代 數據提供方的操作。

寫緩存:通過增加額外花費的時間,來延遲數據處理方的工作。

寫緩存實踐:redis(發布訂閱),消息隊列(發布訂閱),數據庫(先生成數據,后期再進行統計,耗時的&對實時性要求不高的,后置)

適合場景:請求峰谷值變化明顯&對實時性要求不高的系統中。

搶購系統,競品系統,秒殺系統,搶紅包系統。

消息推送系統:極光,百度。

實時性不高。

大廠:

需求:平峰(請求量在某個閾值之下):正常處理。峰值超過閾值的時候,觸發寫緩存。

降級:微服務降級組件處理可以。

灰度發布。配置灰度規則(規則中 請求的閾值,根據閾值的不同,調用不同的系統)。

限流。要對流量進行 評估。

面試:寫的訪問量增大,怎么處理。

下單:訂閱消息,不重要的系統訂閱關鍵 業務的數據。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921478.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

happen-before原則

什么是 happen-before 原則&#xff1f; happen-before 是一個邏輯關系&#xff0c;用于描述兩個操作之間的 “先后順序”—— 如果操作 A happen-before 操作 B&#xff0c;那么 A 的執行結果必須對 B 可見&#xff0c;且 A 的執行順序在邏輯上先于 B。也就是保證指令有序性和…

4.1 機器學習 - 評估指標

模型評估是判斷 “模型是否有效” 的核心環節&#xff0c;需結合任務類型&#xff08;分類 / 回歸&#xff09;、數據分布&#xff08;如類別不平衡&#xff09;和商業目標選擇指標。本節聚焦分類任務的核心評估指標&#xff0c;從定義、計算邏輯到適用場景逐一拆解&#xff0c…

雅菲奧朗SRE知識墻分享(七):『可觀測性的定義與實踐』

在分布式系統日益復雜的當下&#xff0c;故障不再是“是否發生”&#xff0c;而是“何時爆發”。SRE可觀測性正是應對不確定性的“顯微鏡”與“導航儀”&#xff1a;通過指標、日志、追蹤三大數據血脈&#xff0c;實時外化系統黑盒&#xff0c;讓每一次抖動、每一行報錯、每一次…

C++ 詳細講解vector類

目錄 1. 什么是vector? 2. vector的使用 1. 構造函數---初始化 1. 默認構造函數(無參構造&#xff09; 2. 填充構造函數(指定數量和初始值&#xff09; 3. 范圍構造函數(通過迭代器拷貝其他容器元素&#xff09; 4. 拷貝構造函數(直接拷貝另一個vector&#xff09; 注…

Windows Server2012 R2 安裝.NET Framework 3.5

Windows Server2012 R2 安裝.NET Framework 3.5 虛擬機系統是Windowsserver 2012R2&#xff0c;在安裝SQlserver2012時候警告未安裝.NET Framework 3.5。于是找了個.NET Framework 3.5的安裝包&#xff0c;但是由于系統原因無法正常安裝。按照提示從控制面板-程序-啟動或關閉Wi…

IDEA中Transaction翻譯插件無法使用,重新配置Transaction插件方法

原因 由于Transaction默認的翻譯引擎為谷歌翻譯&#xff0c;由于一些原因&#xff0c;這個翻譯無法使用&#xff0c;因此導致插件無法使用。 解決辦法 更換Transaction插件翻譯引擎即可。 方法步驟 1.進入Idea的設置里&#xff0c;找到Tool下的Transaction選項2.更改翻譯引擎&a…

外置flash提示音打包腳本

批處理腳本說明文檔 - 音頻資源打包與分發 一、腳本功能概述 本批處理腳本&#xff08;.bat 文件&#xff09;用于將指定目錄下的多個音頻文件&#xff08;.wtg 和 .mp3 格式&#xff09;打包為音頻資源配置文件&#xff08;tone.cfg&#xff09;&#xff0c;進一步將配置文件與…

Go語言設計模式(三)抽象工廠模式

抽象工廠模式與工廠模式類似,被認為是工廠方法模式的另一層抽象.抽象工廠模式圍繞創建其他工廠的超級工廠工作.1.角色:1.1抽象產品:構成產品系列的一組不同但相關的產品的聲明接口.1.2具體產品:實現抽象產品接口的類,主要用于定義產品對象,由相應的具體工廠創建.1.3抽象工廠:創…

大狗王 DG1+ 13.6G礦機詳細參數解析與性能評測

近年來&#xff0c;隨著加密貨幣挖礦行業的不斷發展&#xff0c;越來越多的礦機廠商推出了高性能、低功耗的礦機設備。大狗王&#xff08;DG1&#xff09;13.6G礦機便是其中一款備受關注的設備&#xff0c;特別是在LTC&#xff08;萊特幣&#xff09;、Doge&#xff08;狗狗幣&…

Python 算術運算練習題

計算數字特征值題目描述 編寫一個程序&#xff0c;接收用戶輸入的兩個整數 a 和 b&#xff08;a > b > 0&#xff09;&#xff0c;計算并輸出以下結果&#xff1a;a 與 b 的和的平方a 除以 b 的商和余數a 與 b 的平均數&#xff08;保留 2 位小數&#xff09;示例請輸入整…

OS項目構建效能改進策劃方案

一、現狀分析與問題定位構建穩定性問題&#xff1a; 表現&#xff1a;非代碼變更引發的構建失敗&#xff08;如環境依賴、工具鏈版本、第三方庫更新、資源競爭等&#xff09;“幽靈構建”時有發生。影響&#xff1a;嚴重破壞開發流程的順暢性&#xff0c;耗費大量開發/測試人員…

Ai8051 2.4寸320*240 ILI9341 I8080接口驅動

/*---------------------------------------------------------------------*/ /* --- Web: www.STCAI.com ---------------------------------------------*/ /* 液晶屏驅動程序參考wiki技術網站提供的開源源碼&#xff0c;僅供學習使用 */ /*----------------------…

最大似然估計:損失函數的底層數學原理

引言當你第一次看到線性回歸時&#xff0c;你是否注意到了作為參數優化關鍵的損失函數&#xff08;均方損失&#xff09;&#xff0c;你是否能夠理解它的本質和由來。其實&#xff0c;在我第一次接觸時&#xff0c;我是感到有些驚訝的&#xff0c;然后試著去強行理解它&#xf…

使用 n8n 結合通義千問大模型構建業務數據庫分析智能體

一、項目概述 本項目致力于構建一個結合 n8n 工作流引擎 與 通義千問大模型 的智能體&#xff0c;旨在對龐大的業務數據庫進行自動化分析、語義建模及自然語言問答。通過不同工作流的迭代構建&#xff0c;實現了表結構解析、業務含義提取、關系可視化、問答服務等能力&#xff…

css margin外邊距重疊/塌陷問題

一、定義 相鄰塊級元素或父子元素的垂直外邊距會合并&#xff08;折疊&#xff09;為單個邊距&#xff0c;其大小為單個邊距的最大值&#xff08;或如果他們相等&#xff0c;則僅為其中的一個&#xff09;&#xff0c;這種行為稱為邊距折疊 <div style"margin-bottom: …

可重復讀 是否“100%”地解決幻讀?

這是一個非常深刻的問題&#xff0c;答案是&#xff1a;幾乎解決了&#xff0c;但在一個非常特殊且罕見的邊界場景下&#xff0c;理論上仍然可能出現幻讀。 因此&#xff0c;嚴格來說&#xff0c;它并非被“徹底”或“100%”地解決。下面我們來詳細分解這個結論&#xff1a;1. …

從零開始的云計算生活——第五十八天,全力以赴,Jenkins部署

目錄 一.故事背景 二.安裝Jenkins必要插件 1.安裝Publish Over SSH 2.安裝maven integration插件 3. 配置jenkins并發執行數量 4. 配置郵件地址 三. 基于Jenkins部署PHP環境 1. 下載ansible插件 2. 下載ansible應用 3. 構建項目 ?編輯 使用Jenkins賬戶生成ssh密鑰 …

串口HAL庫發送問題

想了很久&#xff0c;不知道該標題起的是否合適&#xff0c;該篇Blog用于記錄在使用HAL庫的USART模塊時實際遇到的一個涉及發送方式的問題&#xff0c;用于提醒自身同時也希望能幫到各位。程序問題敘述先來看一段代碼&#xff1a;void CusUSART_SendByte_IT( uint8_t Byte ) { …

CUDA默認流的同步行為

默認流 對于需要指定 cudaStream_t參數的 cuda API&#xff0c;如果將 0作為實參傳入&#xff0c;則視為使用默認流&#xff1b;對于不需要指定 cudaStream_t參數的 cuda API&#xff0c;則也視為使用默認流。 在 cuda中&#xff0c;默認流有兩種類型&#xff0c;一種是 legacy…

「數據獲取」《中國電力統計年鑒》(1993-2024)(含中國電力年鑒)

01、數據簡介一、《中國電力統計年鑒》作為全面系統反映中國電力領域發展狀況的權威性年度統計資料&#xff0c;涵蓋了電力建設、生產、消費及供需等全鏈條關鍵信息。其編制工作有著深厚的歷史積淀&#xff0c;可追溯至 20 世紀 50 年代&#xff0c;歷經數十年的積累與完善&…