多級緩存詳解

多級緩存

傳統緩存: 傳統緩存策略一般是請求到達Tomcat后,先查詢Redis,如果未命中則查詢數據庫。

這種模式下請求一定要經過Tomcat處理,Tomcat的性能就成為了整個系統的瓶頸;并且Redis的緩存也有過期時間,一旦過期,請求依舊會直接打到數據庫,對數據庫帶來沖擊。

多級緩存: 多級緩存就是充分利用請求處理的每個環節,分別添加上緩存,減輕tomcat壓力,提升服務器性能。例如:瀏覽器客戶端緩存Nginx本地緩存Redis緩存Tomcat進程緩存 。(緩存從左到右依次向下,最后到達數據庫,注意這里的Redis緩存在Tomcat前面了,因為Nginx里也可以編程)

垂直分表

同一個商品的信息可以考慮保存在兩張表里面,關于這個商品的不同類型的信息各自保存在一個表里面。例如可以是商品庫存和售出信息保存在一張表,商品的基本信息保存在另外一張表里面,這樣當商品庫存發生變化的時候,緩存中的商品基本信息可以不用改動。

Nginx

nginx是 反向代理服務器(接收客戶端請求,轉發給后端服務)負載均衡器(多個后端服務之間分發請求,提高系統吞吐量)靜態資源服務器(提供HTML、CSS、JS、圖片等靜態資源) 等。 用戶的請求會先來到Nginx,靜態資源在nginx中獲取,頁面上的數據通過ajax異步地從后端服務中獲取。

Caffeine

分布式緩存: 例如Redis,可以在集群中 共享 ,容量更大,可靠性更高。但是會有網絡IO地開銷。

進程本地緩存: 例如HashMap、GuavaCache等,緩存在本地,沒有網絡IO開銷,速度更快。但是存儲容量有限,且集群間無法共享。

Caffeine是目前性能最高,更強大的緩存庫。它可以設置緩存的 容量過期策略(按時間過期、按容量過期)超強的并發性能

Lua腳本

由于我們將redis層放在的tomcat進程層的上一層,所以操作redis的事情就由nginx來干了,而Lua是操作nginx的語言。

lua是一種輕量小巧的腳本語言,用C語言編寫,設計目的是嵌入應用程序中。

OpenResty

OpenResty是一個基于Nginx的高性能Web平臺,通過Lua擴展Nginx實現的可伸縮的Web平臺。OpenResty內置了Nginx,在nginx的基礎上進行了功能的擴展,可以直接把這個當成nginx來使用,只是可以有更多的功能。

本來nginx是攔截請求之后轉發給后端的tomcat服務器來處理,現在是交給lua腳本來處理,在lua腳本中填寫業務邏輯。

原生的Nginx不支持lua模塊,我們就沒辦法再nginx中做業務處理。有了OpenResty之后,我們就可以在Nginx中引入lua腳本模塊,然后通過編寫lua腳本在nginx做業務邏輯的處理,可以在nginx層就做一層緩存,瀏覽器請求先被nginx捕捉到然后執行lua腳本,腳本中封裝了http請求,再將該請求發送出去由nginx轉發給后續業務(redis層或者tomcat層)。

Redis緩存預熱

服務剛剛啟動時,redis中并沒有緩存,如果所有商品數據都在第一次查詢的時候添加緩存,那么數據庫就會面臨很大的壓力。所以就要在實際開發中做緩存的預熱,利用大數據統計用戶訪問的熱點數據,在項目啟動的時候將這些熱點數據提前放到緩存中。

通過配置一個RedisHandler的Bean實現Initializing接口并且實現afterPropertieSet()方法,在其中實現緩存預熱。這里涉及到Bean的生命周期,這個afterPropertieSet方法是在Bean的依賴注入之后自動調用。

Nginx層查詢Redis

OpenResty也為Nginx提供了操作Redis的模塊,只要引入該模塊就能直接使用,直接操作Redis了。這里和redis建立連接使用的是長連接,使用完后會放進連接池,規定時間沒用該連接才會被釋放。

Nginx本地緩存

OpenResty為Nginx提供了shard dict功能,可以在nginx的多個worker之間共享數據,實現nginx本地緩存功能。

修改item.lua中的read_data函數,優先查詢本地緩存,未命中的時候再查詢Redis、Tomcat,查詢Redis和Tomcat成功后,將數據寫入本地緩存,并設置有效期。

數據同步

數據庫(真實數據)與緩存數據的一致性是我們要解決的問題,也就是數據同步問題。

常見的數據同步方法有3種:

設置有效期: 緩存設置有效期,到期自動刪除,再次查詢的時候更新。

同步雙寫: 更新數據庫的時候,直接修改緩存。

異步通知: 更新數據庫的時候發送事件通知,使用MQ或者其它機制(監聽數據庫binlog)來接收通知后修改緩存數據。

Canal監聽binlog

camal是通過mysql的主從同步使用的binlog來實現了,canal把自己偽裝成了一個slave節點,然后需要監聽的mysql作為master生成binlog,canal不斷去讀取master的binlog,如果binlog發生變化了,那么canal立刻就知道了,然后根據變化來進行后續的處理。所以要想使用canal,還要去實現mysql的 主從同步

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

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

相關文章

接口自動化-JSON Schema

目錄 1.介紹 2.安裝 3.使用 3.1type關鍵字 3.2最大值最小值 3.2.1minimum 、 maximum 3.2.2 exclusiveMinimum 、exclusiveMaximum 3.3字符串特殊校驗 3.4數據約束 3.5對象約束 3.6必須屬性 3.7依賴關系 4.總結 1.介紹 JSON Schema 是一個用來定義和校驗 JSON 的…

前端技術架構設計文檔(Vue2+Antd+Sass)

前端技術架構設計文檔(Vue2AntdSass) 文檔信息項目名稱前端系統(基于 Vue2 技術棧)技術棧核心Vue2 Ant Design Vue Sass版本號V1.0.0技術棧核心Vue2 Ant Design Vue Sass編制日期2025-08-071. 技術棧選型 1.1 核心技術框架類別…

【設計模式】抽象工廠模式 (工具(Kit)模式)

抽象工廠模式(Abstract Factory Pattern)詳解一、抽象工廠模式簡介 抽象工廠模式(Abstract Factory Pattern) 是一種 創建型設計模式(對象創建型模式),它提供了一種創建一系列相關或相互依賴對象…

Android初學者系統開發學習路線參考

Android初學者系統開發學習路線參考 文章目錄Android初學者系統開發學習路線參考一、前言二、Android初學的學習計劃第一階段(一個月)UI相關學習:開發環境與 UI 基礎,第一周:UI 控件與布局進階,第二周&…

擴散LLM推理新范式:打破生成長度限制,實現動態自適應調節

隨著 Gemini-Diffusion,Seed-Diffusion 等擴散大語言模型(DLLM)的發布,這一領域成為了工業界和學術界的熱門方向。但是,當前 DLLM 存在著在推理時必須采用預設固定長度的限制,對于不同任務都需要專門調整才…

【ee類保研面試】其他類---計算機網絡

25保研er,希望將自己的面試復習分享出來,供大家參考 part0—英語類 part1—通信類 part2—信號類 part3—高數類 part100—self項目準備 文章目錄計算機網絡知識點大全**計算機網絡知識點總結**一、五層協議模型二、OSI七層模型補充三、TCP 與 UDP 及區別…

Python-機器學習(一)——特征工程

目錄 特征工程 一、特征提取 1、字典特征提取 2、文本特征提取 2.1 英文文本提取 2.2 中文文本提取 3、TF-IDF文本特征詞的重要程度特征提取 二、無量綱化-預處理 1 MinMaxScaler 歸一化 2 normalize歸一化 3 StandardScaler 標準化 三、特征降維 1、特征選擇 1.…

談談SQL計算存儲引擎中的索引和計算

背景 最近在這家公司做了一些事情,做的事情和以往的工作不太一樣,不一樣的點呢就是 之前我主要的工作是關注計算這方面,因為數據量大,研究的是怎么加速查詢,怎么研究規則去優化,怎么去解規則的bug等等。因為…

vscode.window.activeTextEditor 獲取不到 png 圖片路徑問題

vscode 的 extensions 插件開發時用 vscode.window.activeTextEditor?.document.uri 獲取不到編輯器打開的圖片路徑,文檔路徑可以獲取到。個人猜測因為圖片不能編輯,所以沒有 activeTextEditor 屬性吧。解決辦法:巧用右鍵獲取路徑和相對的路…

Java 大視界 -- Java 大數據在智能醫療手術機器人操作數據記錄與性能評估中的應用(390)

Java 大視界 -- Java 大數據在智能醫療手術機器人操作數據記錄與性能評估中的應用(390)引言:正文:一、傳統手術機器人的 “黑箱困境”:記不全、算不清、追不到1.1 設備與臨床的 “斷層”1.1.1 數據記錄 “太粗放”1.1.…

C++的結構體指針

結構體變量和結構體指針的區別特性結構體變量結構體指針存儲內容結構體的實際數據內存地址內存開銷結構體總大小固定4/8字節(指針大小)成員訪問運算符.->函數傳參時的行為值拷貝(新副本)地址傳遞(操作原數據&#x…

pdf文件轉word免費使用幾個工具

在線工具(無需安裝) Smallpdf ? 核心功能: 網頁端直接操作,支持 PDF 與 Word 格式互轉 免費用戶每日限 2 次轉換(免注冊) 自動清除服務器文件,確保隱私安全 🔗 訪問鏈接&#xff1a…

Vue3 組件化開發

文章目錄前言組件化開發底部菜單 TabMenu父子組件相互傳數據父傳子:自定義屬性子傳父:自定義事件父子組件互傳案例插槽 slot多個插槽總結組件化開發總結Vue組件的基本組成子組件使用的三個步驟父子組件相互傳遞數據前言 提示:這里可以添加本…

服務器硬件電路設計之I2C問答(二):I2C總線的傳輸速率與上拉電阻有什么關系?

I2C 總線傳輸速率與上拉電阻關系密切。上拉電阻阻值決定總線電平切換速度:電阻越小,充放電電流越大,信號邊沿更陡,支持更高速率(如 400kHz 快速模式);電阻過大則切換慢,限制速率&…

大語言模型提示工程與應用:LLMs文本生成與數據標注實踐

提示詞應用實踐 學習目標 本課程通過LLMs生成情感分析樣本和標注葡萄9品鑒數據,展示了其文本生成和數據標注能力。同時,利用PAL模型解決日期計算問題,學習了LLMs與編程運行時結合實現復雜推理的方法,為自然語言處理應用提供了實…

node.js 零基礎入門

Node.js 零 基礎入門與核心語法 適用對象:完全沒接觸過 Node.js 的同學 目標:從 0 到能寫 CLI、小型 HTTP 服務、文件腳本、調用系統/網絡資源 目錄 什么是 Node.js安裝與運行運行腳本與 REPL模塊體系:CommonJS 與 ES Modules基礎語法在 Node…

《Day3-PyTorch 自動微分入門:從計算圖到梯度下降的實踐指南》

八、自動微分自動微分模塊torch.autograd負責自動計算張量操作的梯度,具有自動求導功能。自動微分模塊是構成神經網絡訓練的必要模塊,可以實現網絡權重參數的更新,使得反向傳播算法的實現變得簡單而高效。1. 基礎概念張量Torch中一切皆為張量…

apache cgi測試

test.cgi #!/bin/sh echo "Content-type: text/html" echo "" echo "<h1>Hello from a Mac CGI script!</h1>" echo "<p>Current time is: $(date)</p>"?% 放置目錄 /opt/homebrew/Cellar/mapserver/8.4.0_1…

力扣 30 天 JavaScript 挑戰 第二題筆記

這道題是涉及知識–閉包 1. 閉包定義以及相關知識點 官方定義為&#xff1a;在 JavaScript 中&#xff0c;函數具有對在相同作用域以及任何外部作用域中聲明的所有變量的引用。這些作用域被稱為函數的 詞法環境。函數與其環境的組合被稱為 閉包。 簡單理解&#xff1a;內層函數…

OpenAI GPT-5 深度解析:API Key定價與ChatGPT(Free, Plus, Pro)用戶的區別

前言&#xff1a;兩年等待&#xff0c;只為這一躍 在科技圈長達兩年的屏息期待與無盡猜想之后&#xff0c;2025年8月8日北京時間凌晨&#xff0c;OpenAI終于揭開了其新一代旗艦模型——GPT-5的神秘面紗。這不僅僅是一次常規的產品迭代&#xff0c;更被整個行業視為一塊試金石&a…