真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在Python應(yīng)用程序中實(shí)現(xiàn)緩存的方法

這篇文章主要介紹了在Python應(yīng)用程序中實(shí)現(xiàn)緩存的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。下面就和我一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元牡丹江做網(wǎng)站,已為上家服務(wù),為牡丹江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

緩存的重要性

緩存對(duì)于每個(gè)Python程序員來(lái)說(shuō)都是一個(gè)需要理解的重要概念。

簡(jiǎn)而言之,緩存的概念主要是利用編程技術(shù)將數(shù)據(jù)存儲(chǔ)在臨時(shí)位置,而不是每次都從源檢索數(shù)據(jù)。

隨后,緩存可以提高應(yīng)用程序的性能,因?yàn)閺呐R時(shí)位置訪問(wèn)數(shù)據(jù)比每次從源(如數(shù)據(jù)庫(kù)、web服務(wù)等)獲取數(shù)據(jù)更快。

本文旨在解釋Python中的緩存是如何工作的。

為什么我們需要實(shí)現(xiàn)緩存?

要理解緩存是什么以及為什么需要緩存,請(qǐng)考慮下面的場(chǎng)景。

我們正在用Python構(gòu)建一個(gè)應(yīng)用程序,它將向最終用戶顯示產(chǎn)品列表。這個(gè)應(yīng)用程序每天會(huì)被超過(guò)100個(gè)用戶多次訪問(wèn)。應(yīng)用程序?qū)⑼泄茉趹?yīng)用程序服務(wù)器上,并且可以在internet上訪問(wèn)它。產(chǎn)品將存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)中,該數(shù)據(jù)庫(kù)將安裝在數(shù)據(jù)庫(kù)服務(wù)器上。因此,應(yīng)用服務(wù)器將查詢數(shù)據(jù)庫(kù)以獲取相關(guān)記錄。

下圖演示了我們的目標(biāo)應(yīng)用程序是如何設(shè)置的:

在Python應(yīng)用程序中實(shí)現(xiàn)緩存的方法

問(wèn)題

從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)是一個(gè)io綁定操作。因此,它的本性是緩慢的。如果頻繁發(fā)送請(qǐng)求,而響應(yīng)更新不頻繁,那么我們可以將響應(yīng)緩存到應(yīng)用程序的內(nèi)存中。

我們可以緩存結(jié)果,而不是每次都查詢數(shù)據(jù)庫(kù),如下所示:

在Python應(yīng)用程序中實(shí)現(xiàn)緩存的方法

獲取數(shù)據(jù)的請(qǐng)求必須通過(guò)線路,響應(yīng)必須通過(guò)線路返回。

這在本質(zhì)上是緩慢的。因此,引入了緩存。

我們可以緩存結(jié)果,以減少計(jì)算時(shí)間和節(jié)省計(jì)算機(jī)資源。

緩存是一個(gè)臨時(shí)存儲(chǔ)位置。它以惰性加載方式工作。

最初,緩存是空的。當(dāng)應(yīng)用程序服務(wù)器從數(shù)據(jù)庫(kù)服務(wù)器獲取數(shù)據(jù)時(shí),它將用所需的數(shù)據(jù)集填充緩存。從那時(shí)起,后續(xù)的請(qǐng)求將從緩存獲取數(shù)據(jù),而不是一路到應(yīng)用程序服務(wù)器。

我們還需要及時(shí)使緩存失效,以確保向最終用戶顯示最新的信息。

這就引出了本文的下一節(jié):緩存規(guī)則。

緩存規(guī)則

在我看來(lái),緩存有三條規(guī)則。

在啟用緩存之前,我們需要執(zhí)行分析應(yīng)用程序的關(guān)鍵步驟。

因此,在應(yīng)用程序中引入緩存之前的第一步是對(duì)應(yīng)用程序進(jìn)行概要分析。只有這樣,我們才能了解每個(gè)函數(shù)需要多長(zhǎng)時(shí)間以及它被調(diào)用了多少次。分析過(guò)程完成后,我們需要確定需要緩存的內(nèi)容。

我們需要一種機(jī)制來(lái)連接函數(shù)的輸入和輸出,并將它們存儲(chǔ)在內(nèi)存中。這就引出了緩存的第一條規(guī)則。

1. 緩存的第一條規(guī)則:

第一個(gè)規(guī)則是確保目標(biāo)函數(shù)需要很長(zhǎng)時(shí)間才能返回輸出,它經(jīng)常被執(zhí)行,并且函數(shù)的輸出不會(huì)經(jīng)常改變。

我們不希望為那些不需要很長(zhǎng)時(shí)間就能完成的函數(shù)、在應(yīng)用程序中很少被調(diào)用的函數(shù)或那些返回結(jié)果卻在源代碼中頻繁更改的函數(shù)引入緩存。

這是一個(gè)需要記住的重要規(guī)則。

適合緩存的候選者:頻繁調(diào)用的函數(shù),輸出不經(jīng)常改變,執(zhí)行需要很長(zhǎng)時(shí)間

作為一個(gè)實(shí)例,如果一個(gè)函數(shù)執(zhí)行了100次,并且函數(shù)需要很長(zhǎng)時(shí)間才能返回結(jié)果,并且對(duì)于給定的輸入它返回相同的結(jié)果,那么我們可以緩存結(jié)果。

然而,如果一個(gè)函數(shù)返回的值更新每一秒在源得到請(qǐng)求執(zhí)行函數(shù)每分鐘然后理解真的很重要我們需要緩存結(jié)果是否會(huì)最終將陳舊的數(shù)據(jù)發(fā)送給用戶。這可以幫助我們理解我們是否需要緩存,或者我們是否需要不同的通信通道、數(shù)據(jù)結(jié)構(gòu)或序列化機(jī)制來(lái)更快地檢索數(shù)據(jù),例如通過(guò)在套接字上使用二進(jìn)制序列化器發(fā)送數(shù)據(jù),而不是使用http上的xml序列化。

此外,知道什么時(shí)候使緩存失效,什么時(shí)候用新數(shù)據(jù)重新加載緩存也很重要。

2. 第二個(gè)規(guī)則:

第二條規(guī)則是確保從引入的緩存機(jī)制獲取數(shù)據(jù)比執(zhí)行目標(biāo)函數(shù)更快。

只有當(dāng)從緩存中檢索結(jié)果的時(shí)間比從數(shù)據(jù)源檢索數(shù)據(jù)的時(shí)間快時(shí),我們才應(yīng)該引入緩存。

緩存應(yīng)該比從當(dāng)前數(shù)據(jù)源獲取數(shù)據(jù)快

因此,選擇合適的數(shù)據(jù)結(jié)構(gòu)(如字典或LRU緩存)作為實(shí)例是至關(guān)重要的。

3.第三個(gè)規(guī)則:

第三條重要的規(guī)則是關(guān)于內(nèi)存占用的,這一點(diǎn)經(jīng)常被忽略。您是在執(zhí)行IO操作(如查詢數(shù)據(jù)庫(kù)、web服務(wù)),還是在執(zhí)行CPU密集型操作(如計(jì)算數(shù)字和執(zhí)行內(nèi)存計(jì)算)?

當(dāng)我們緩存結(jié)果時(shí),應(yīng)用程序的內(nèi)存占用將會(huì)增加,因此選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)并只緩存需要緩存的數(shù)據(jù)屬性是至關(guān)重要的。

有時(shí)我們查詢多個(gè)表來(lái)創(chuàng)建一個(gè)類的對(duì)象。但是,我們只需要在應(yīng)用程序中緩存基本屬性。

緩存影響內(nèi)存占用

作為一個(gè)實(shí)例,考慮我們構(gòu)建了一個(gè)報(bào)告指示板,它查詢數(shù)據(jù)庫(kù)并檢索訂單列表。為了便于說(shuō)明,讓我們考慮一下儀表板上只顯示訂單名。

因此,我們可以只緩存每個(gè)訂單的名稱,而不是緩存整個(gè)訂單對(duì)象。通常,架構(gòu)師建議創(chuàng)建一個(gè)具有__slots__屬性的精益數(shù)據(jù)傳輸對(duì)象(DTO),以減少內(nèi)存占用。也使用了命名元組或Python數(shù)據(jù)類。

這就引出了本文的最后一節(jié),概述了如何實(shí)現(xiàn)緩存的細(xì)節(jié)。

如何實(shí)現(xiàn)緩存?

有多種實(shí)現(xiàn)緩存的方法。

我們可以在Python進(jìn)程中創(chuàng)建本地?cái)?shù)據(jù)結(jié)構(gòu)來(lái)構(gòu)建緩存,或者將緩存作為服務(wù)器,充當(dāng)代理并為請(qǐng)求提供服務(wù)。

有一些內(nèi)置的Python工具,比如使用functools庫(kù)中的cached_property裝飾器。我想通過(guò)提供緩存裝飾器屬性的概述來(lái)介紹緩存的實(shí)現(xiàn)。

下面的代碼片段說(shuō)明了緩存屬性是如何工作的。

from functools import cached_propertyclass FinTech:    @cached_property  def run(self):     return list(range(1,100))
     

結(jié)果,F(xiàn)inTech().run現(xiàn)在被緩存,range(1100)的輸出將只生成一次。然而,在實(shí)際場(chǎng)景中,我們幾乎不需要緩存屬性。

讓我們回顧一下其他方法。

1. 字典的方法

對(duì)于簡(jiǎn)單的用例,我們可以創(chuàng)建/使用映射數(shù)據(jù)結(jié)構(gòu),如字典,我們可以保存在內(nèi)存中,并使其在全局框架上可訪問(wèn)。

有多種方法來(lái)實(shí)現(xiàn)它。最簡(jiǎn)單的方法是創(chuàng)建一個(gè)單例樣式的模塊,例如config.py

在配置。我們可以創(chuàng)建一個(gè)dictionary類型的字段,在開始時(shí)填充一次。從那時(shí)起,可以使用dictionary字段來(lái)獲取結(jié)果。

2. 最近使用的算法

我們可以使用Python的內(nèi)置特性LRU。

LRU代表最近最少使用的算法。LRU可以緩存函數(shù)的返回值,這些返回值依賴于傳遞給函數(shù)的參數(shù)。

LRU在遞歸CPU綁定操作中特別有用。

它本質(zhì)上是一個(gè)裝飾器:@lru_cache(maxsize, typed),我們可以用它來(lái)裝飾函數(shù)。

maxsize告訴裝飾器緩存的最大大小。如果我們不想設(shè)置大小,那么只需將其設(shè)置為None。

typed用于指示是否要將輸出緩存為可以比較不同類型值的相同值。

當(dāng)我們期望相同的輸入產(chǎn)生相同的輸出時(shí),這是有效的。

將所有數(shù)據(jù)保存在應(yīng)用程序的內(nèi)存中可能會(huì)帶來(lái)麻煩。

在具有多個(gè)進(jìn)程的分布式應(yīng)用程序中,這可能會(huì)成為一個(gè)問(wèn)題,因?yàn)椴贿m合將所有結(jié)果緩存到所有進(jìn)程的內(nèi)存中。

一個(gè)很好的用例是應(yīng)用程序運(yùn)行在一個(gè)機(jī)器集群上。我們可以將緩存作為一種服務(wù)托管。

3.緩存即服務(wù)

第三種選擇是將緩存數(shù)據(jù)作為外部服務(wù)托管。該服務(wù)可以負(fù)責(zé)存儲(chǔ)所有請(qǐng)求和響應(yīng)。

所有應(yīng)用程序都可以通過(guò)緩存服務(wù)檢索數(shù)據(jù)。它就像一個(gè)代理。

假設(shè)我們正在構(gòu)建一個(gè)和Wikipedia一樣大的應(yīng)用程序,它將同時(shí)或并行地服務(wù)1000個(gè)請(qǐng)求。

我們需要一個(gè)緩存機(jī)制,并希望在服務(wù)器之間分布緩存。

我們可以使用memcache并緩存數(shù)據(jù)。

Memcached在Linux和Windows中非常流行,因?yàn)?

  • 它可以用于實(shí)現(xiàn)具有狀態(tài)的記憶緩存。

  • 它甚至可以跨服務(wù)器分布。

  • 它使用起來(lái)非常簡(jiǎn)單,速度很快,并且在多個(gè)大型組織中廣泛使用。

  • 它支持自動(dòng)過(guò)期緩存的數(shù)據(jù)

我們需要安裝一個(gè)叫做pymemcache的python庫(kù)。

Memcache要求數(shù)據(jù)以字符串或二進(jìn)制形式存儲(chǔ)。因此,我們必須序列化緩存的對(duì)象,并在需要檢索它們時(shí)反序列化它們。

代碼片段展示了如何啟動(dòng)和使用memcache:

client = Client(host, serialiser, deserialiser)client.set(‘blog’: {‘name’:’caching’, ‘publication’:’fintechexplained’}}blog = client.get(‘blog’)
 

以上就是在Python應(yīng)用程序中實(shí)現(xiàn)緩存的方法的詳細(xì)內(nèi)容了,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎來(lái)創(chuàng)新互聯(lián)行業(yè)資訊!


標(biāo)題名稱:在Python應(yīng)用程序中實(shí)現(xiàn)緩存的方法
轉(zhuǎn)載注明:http://weahome.cn/article/gcsgsc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部