nginx-lua緩存機制

一. 簡述:?

? ? ?緩存是一個大型系統中非常重要的一個組成部分。在硬件層面,大部分的計算機硬件都會用緩存來提高速度,比如CPU會有多級緩存、RAID卡也有讀寫緩存。在軟件層面,我們用的數據庫就是一個緩存設計非常好的例子,在SQL語句的優化、索引設計、磁盤讀寫的各個地方,都有緩存。一個生產環境的緩存系統,需要根據自己的業務場景和系統瓶頸,來找出最好的方案,這是一門平衡的藝術。

? 通常情況下,緩存有兩個原則:

1. 盡量靠近用戶:如能用本地緩存的就不要發送HTTP請求,能用CDN緩存的就不要打到web服務器,能用nginx緩存的就不要用數據庫的緩存。
2. ?盡量使用本進程和本機:因為跨了進程和機器甚至機房,緩存的網絡開銷就會變大,在高并發的時候會非常明顯。

二. 關于nginx?lua緩存:

在nginx的lua模塊中,通常情況下,可采用兩種緩存方式;

?1. ?跨worker共享:lua_shared_dict

? ?在使用前,需要在配置文件中進行聲明:

#/etc/nginx/nginx.conf
lua_shared_dict my_cache 20m;

?調用代碼片段:

function get_from_cache(key)local cache_ngx = ngx.shared.my_cachelocal value = cache_ngx:get(key)return value
endfunction set_to_cache(key, value, exptime)if not exptime thenexptime = 0endlocal cache_ngx = ngx.shared.my_cachelocal succ, err, forcible = cache_ngx:set(key, value, exptime)return succ
end--這里面用的就是ngx shared dict cache。如同它的名字一樣,這個cache是nginx所有worker之間共享的,內部使用的LRU算法來判斷緩存是否在內存占滿時被清除。

2)worker獨享:lua LRU cache

? ?代碼片段:

local _M = {}-- alternatively: local lrucache = require "resty.lrucache.pureffi"
local lrucache = require "resty.lrucache"-- we need to initialize the cache on the lua module level so that
-- it can be shared by all the requests served by each nginx worker process:
local c = lrucache.new(200)  -- allow up to 200 items in the cache
if not c thenreturn error("failed to create the cache: " .. (err or "unknown"))
endfunction _M.go()c:set("dog", 32)c:set("cat", 56)ngx.say("dog: ", c:get("dog"))ngx.say("cat: ", c:get("cat"))c:set("dog", { age = 10 }, 0.1)  -- expire in 0.1 secc:delete("dog")
endreturn _M-- 這個cache是worker級別的,不會在nginx wokers之間共享。并且,它是預先分配好key的數量,而shared dcit需要自己用key和value的大小和數量,來估算需要把內存設置為多少。

兩者差異:

? ? 1.?shared.dict 使用的是共享內存(相對占用較少),每次操作都是全局鎖,如果高并發環境,不同worker之間容易引起競爭。所以單個shared.dict的體積不能過大。lrucache是worker內使用的,由于nginx是單進程方式存在,所以永遠不會觸發鎖,效率上有優勢,并且沒有shared.dict的體積限制,內存上也更彈性,但不同worker之間數據不同享,同一緩存數據可能被冗余存儲。

? ? 2. lua lru cache提供的API比較少,現在只有get、set和delete,而ngx shared dict還可以add、replace、incr、get_stale(在key過期時也可以返回之前的值)、get_keys(獲取所有key,雖然不推薦)。

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

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

相關文章

Java 面試中的高頻算法題詳解

💖 歡迎來到我的博客! 非常高興能在這里與您相遇。在這里,您不僅能獲得有趣的技術分享,還能感受到輕松愉快的氛圍。無論您是編程新手,還是資深開發者,都能在這里找到屬于您的知識寶藏,學習和成長…

【Python項目】手寫數字識別系統

【Python項目】手寫數字識別系統 技術簡介:采用Python技術、Django框架、MYSQL數據庫等實現。 系統簡介:手寫數字識別系統主要的功能有手寫字識別、手寫字管理、修改密碼、個人信息和用戶管理。 背景: 在當今這個飛速發展的時代,…

Springboot + vue 小區物業管理系統

🥂(???)您的點贊👍?評論📝?收藏?是作者創作的最大動力🤞 💖📕🎉🔥 支持我:點贊👍收藏??留言📝歡迎留言討論 🔥🔥&…

空指針:HttpSession異常,SpringBoot集成WebSocket

異常可能性: 404 : 請檢查攔截器是否將請求攔截WebSocket握手期間HttpSession為空 HttpSession為空 方法一 : 網上參考大量的文檔,有說跟前端請求域名有關系的。 反正對我來說,沒啥用無法連接。 需使用 localhost&a…

什么是視頻孿生智慧能源?視頻孿生智慧能源的應用案例

?視頻孿生智慧能源是集三維地理信息系統、視頻虛實融合、數字孿生、人工智能等多技術于一體的綜合應用,旨在實現對能源系統的實時、動態、全方位監控和管理?。 具體來說,視頻孿生智慧能源通過以下方式實現其功能: ?技術融合?:…

【update 更新數據語法合集】.NET開源ORM框架 SqlSugar 系列

系列文章目錄 🎀🎀🎀 .NET開源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目錄 系列文章目錄前言 🍃一、實體對象更新1.1 單條與批量1.2 不更新某列1.3 只更新某列1.4 NULL列不更新1.5 無主鍵/指定列…

006-excel數據輸出insert語句

一、在空白列插入,選擇需要的列 "INSERT INTO tab_name1 (code, name) VALUES ("&A1&", "&B1&");"二、 拖動填充塊,或者雙擊填充塊(可以快速填充整列) 三、直接把生成的 insert 語…

前端組件開發:組件開發 / 定義配置 / 配置驅動開發 / 爬蟲配置 / 組件V2.0 / form表單 / table表單

一、最早的靈感 最早的靈感來自sprider / 網絡爬蟲 / 爬蟲配置,在爬蟲爬取網站文章時候,會輸入給爬蟲一個配置文件,里邊的內容是一個json對象。里邊包含了所有想要抓取的頁面的信息。爬蟲通過這個配置就可以抓取目標網站的數據。其實本文要引…

43.Textbox的數據綁定 C#例子 WPF例子

固定最簡步驟,包括 XAML: 題頭里引入命名空間 標題下面引入類 box和block綁定屬性 C#: 通知的類,及對應固定的任務 引入字段 引入屬性 屬性雙觸發,其中一個更新block的屬性 block>指向box的屬性 從Textbo…

excel按行檢索(index+match)

假設你的數據表如下: 假設 數據區域是 A1:D4。 你想查詢某人在某個日期的數據。 實現步驟 公式 在某個單元格中使用以下公式: excel 復制代碼 INDEX(A2:D4, MATCH(“張三”, A2:A4, 0), MATCH(“2025/01/02”, A1:D1, 0)) 2. 公式拆解 MATCH(“張三”,…

信創改造-龍蜥操作系統搭載MySql、Tomcat等服務

龍蜥操作系統 Anolis OS 8 是 OpenAnolis 社區推出的完全開源、中立、開放的發行版,它支持多計算架構,也面向云端場景優化,兼容 CentOS 軟件生態。Anolis OS 8 旨在為廣大開發者和運維人員提供穩定、高性能、安全、可靠、開源的操作系統服務。…

FPGA EDA軟件的位流驗證

位流驗證,對于芯片研發是一個非常重要的測試手段,對于純軟件開發人員,最難理解的就是位流驗證。在FPGA芯片研發中,位流驗證是在做什么,在哪些階段需要做位流驗證,如何做?都是問題。 我們先整體的…

px、em 和 rem 的區別:深入理解 CSS 中的單位

文章目錄 前言一、px - 像素 (Pixel)二、em - 相對父元素字體大小 (Ems)三、rem - 相對于根元素字體大小 (Root Ems)四、綜合比較結語 前言 在CSS中,px、em和rem是三種用于定義尺寸(如寬度、高度、邊距、填充等)的長度單位。它們各自有不同的…

【CI/CD構建】關于不小心將springMVC注解寫在service層

背景 之前寫一個接口的時候沒有察覺到將RequestBody這個注解帶到service層了。 今天提交代碼的時候,插件沒有檢測到這個低級錯誤,導致試飛構建連maven編譯都過不了,maven找不到程序包org.springframework.web.bind.annotation這個包 結果…

Oracle Dataguard(主庫為雙節點集群)配置詳解(4):配置備庫

Oracle Dataguard(主庫為雙節點集群)配置詳解(4):配置備庫 目錄 Oracle Dataguard(主庫為雙節點集群)配置詳解(4):配置備庫一、為備庫配置靜態監聽1、配置 li…

《深入理解Mybatis原理》Mybatis中的緩存實現原理

一級緩存實現 什么是一級緩存? 為什么使用一級緩存? 每當我們使用MyBatis開啟一次和數據庫的會話,MyBatis會創建出一個SqlSession對象表示一次數據庫會話。 在對數據庫的一次會話中,我們有可能會反復地執行完全相同的查詢語句&…

win32匯編環境,窗口程序中單選框的一般操作示例

;運行效果 ;win32匯編環境,窗口程序中單選框的一般操作示例 ;比如在窗口程序中生成單選框,默認哪項選中,判斷當前選中哪一項,讓哪項選中,得到選中項的名稱等 ;直接抄進RadAsm可編譯運行。重點部分加備注。 ;以下是ASM文件 ;>&g…

從transformer到informer

Transformer和Informer都是深度學習領域中的模型架構,它們主要用于處理序列數據,如自然語言處理(NLP)和時間序列預測任務。 **Transformer**: Transformer模型最初在2017年由Google的研究者提出,它在NLP領…

hive知識體系

hive知識體系 hive知識體系 鏈接: 1Hive概覽 鏈接: 2Hive表類型 鏈接: 3Hive數據抽樣 鏈接: 4Hive計算引擎 鏈接: 5Hive存儲與壓縮 鏈接: 6Hive Sql 大全 鏈接: 6Hive Sql 大全-Hive 函數 鏈接: 6Hive Sql 大全-窗口函數 鏈接: 7Hive執行計劃 鏈接: 8Hive SQL底層執行原理 鏈接…

優化 Azure Synapse Dedicated SQL Pool中的 SQL 執行性能的經驗方法

在 Azure Synapse Dedicated SQL Pool中優化 SQL 執行涉及了解底層體系結構(例如分布和分區)、查詢優化(例如避免不必要的子查詢和聯接),以及利用具體化視圖和 PolyBase 等工具進行高效數據加載。 1.有效使用分布和分…