偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

高級Python技術(shù):如何在Python應用程序中實現(xiàn)緩存

開發(fā) 后端
緩存對于每個Python程序員來說都是一個需要理解的重要概念。本文旨在解釋Python中的緩存是如何工作的。

緩存的重要性

緩存對于每個Python程序員來說都是一個需要理解的重要概念。

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

隨后,緩存可以提高應用程序的性能,因為從臨時位置訪問數(shù)據(jù)比每次從源(如數(shù)據(jù)庫、web服務等)獲取數(shù)據(jù)更快。

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

高級Python技術(shù):如何在Python應用程序中實現(xiàn)緩存

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

要理解緩存是什么以及為什么需要緩存,請考慮下面的場景。

我們正在用Python構(gòu)建一個應用程序,它將向最終用戶顯示產(chǎn)品列表。這個應用程序每天會被超過100個用戶多次訪問。應用程序?qū)⑼泄茉趹贸绦蚍掌魃希⑶铱梢栽趇nternet上訪問它。產(chǎn)品將存儲在一個數(shù)據(jù)庫中,該數(shù)據(jù)庫將安裝在數(shù)據(jù)庫服務器上。因此,應用服務器將查詢數(shù)據(jù)庫以獲取相關(guān)記錄。

下圖演示了我們的目標應用程序是如何設置的:

高級Python技術(shù):如何在Python應用程序中實現(xiàn)緩存

問題

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

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

高級Python技術(shù):如何在Python應用程序中實現(xiàn)緩存

獲取數(shù)據(jù)的請求必須通過線路,響應必須通過線路返回。

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

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

緩存是一個臨時存儲位置。它以惰性加載方式工作。

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

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

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

緩存規(guī)則

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

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

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

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

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

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

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

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

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

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

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

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

(2) 第二個規(guī)則

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

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

緩存應該比從當前數(shù)據(jù)源獲取數(shù)據(jù)快

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

(3) 第三個規(guī)則

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

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

有時我們查詢多個表來創(chuàng)建一個類的對象。但是,我們只需要在應用程序中緩存基本屬性。

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

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

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

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

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

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

我們可以在Python進程中創(chuàng)建本地數(shù)據(jù)結(jié)構(gòu)來構(gòu)建緩存,或者將緩存作為服務器,充當代理并為請求提供服務。

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

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

  1. from functools import cached_property 
  2. class FinTech: 
  3.    
  4.   @cached_property 
  5.   def run(self): 
  6.      return list(range(1,100)) 

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

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

1. 字典的方法

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

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

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

2. 最近使用的算法

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

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

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

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

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

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

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

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

在具有多個進程的分布式應用程序中,這可能會成為一個問題,因為不適合將所有結(jié)果緩存到所有進程的內(nèi)存中。

一個很好的用例是應用程序運行在一個機器集群上。我們可以將緩存作為一種服務托管。

3. 緩存即服務

第三種選擇是將緩存數(shù)據(jù)作為外部服務托管。該服務可以負責存儲所有請求和響應。

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

假設我們正在構(gòu)建一個和Wikipedia一樣大的應用程序,它將同時或并行地服務1000個請求。

我們需要一個緩存機制,并希望在服務器之間分布緩存。

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

Memcached在Linux和Windows中非常流行,因為:

  • 它可以用于實現(xiàn)具有狀態(tài)的記憶緩存。
  • 它甚至可以跨服務器分布。
  • 它使用起來非常簡單,速度很快,并且在多個大型組織中廣泛使用。
  • 它支持自動過期緩存的數(shù)據(jù)

我們需要安裝一個叫做pymemcache的python庫。

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

代碼片段展示了如何啟動和使用memcache:

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

原文鏈接:

https://medium.com/fintechexplained/advanced-python-how-to-implement-caching-in-python-application-9d0a4136b845

 

責任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2011-12-07 12:01:31

ibmdw

2018-10-29 10:13:29

Windows 10應用程序卸載

2023-03-13 00:16:28

2015-03-30 09:32:15

XcodeiOS應用程序

2018-03-28 08:30:01

Linux倉庫應用程序

2019-08-13 15:39:27

Linux應用程序

2019-05-08 11:30:41

MicrosoftWindows 10后臺應用程序

2011-06-14 14:57:06

QT Python GUI

2018-09-13 08:49:08

DockerPythonDjango

2023-09-19 23:17:43

Python緩存

2011-01-28 09:12:53

jQuery Mobi

2016-08-02 10:34:17

LinuxWindows雙啟動

2010-06-12 16:41:10

BlackBerry開

2021-05-07 15:36:50

iOS隱藏應用程序

2011-05-18 10:42:48

2013-03-25 10:38:24

ASP.NETHttpModule

2023-12-14 16:16:03

Django應用程序Python

2015-02-05 10:11:44

HTML5Application

2013-06-24 10:21:47

面向?qū)ο?/a>Web應用JavaScript

2021-09-26 08:30:31

Python應用程序代碼
點贊
收藏

51CTO技術(shù)棧公眾號