Flask-Cache的使用
當一個資源需要從服務器中獲取,并且資源比較龐大,服務器可能處理起來比較慢,并且此功能為熱門功能,可能用戶需要經(jīng)常訪問獲取。此時,服務器就可以考慮緩存技術。緩存就是數(shù)據(jù)交換的緩沖區(qū)(稱作Cache),當某一硬件要讀取數(shù)據(jù)時,會首先從緩存中查找需要的數(shù)據(jù),如果找到了則直接執(zhí)行,找不到的話則從內(nèi)存中找。由于緩存的運行速度比內(nèi)存快得多,故緩存的作用就是幫助硬件更快地運行。接下來將記錄一下如何緩存一個Flask的請求,并且記錄一下Flask的緩存擴展庫Flask-Cache:
安裝
pip install flask-cache- 1
初始化
當我們安裝好了Flask-Cache模塊時,我們還需要對其進行實例化,并進行相應的配置:
from flask import Flask from flask_cache import Cacheapp = Flask(__name__) cache = Cache(app,config={"CACHE_TYPE":"simple" })- 1
- 2
- 3
- 4
- 5
- 6
- 7
也可以使用init_app()方法稍后設置你的實例:
app = Flask(__name__) cache = Cache(config={"CACHE_TYPE":"simple" }) cache.init_app(app)- 1
- 2
- 3
- 4
- 5
或者也可以這樣:
app = Flask(__name__) cache = Cache() cache.init_app(app,config={"CACHE_TYPE":"simple" })- 1
- 2
- 3
- 4
- 5
緩存視圖函數(shù)
要緩存視圖函數(shù),你可以使用@cache.cached()裝飾器,這個裝飾器默認使用request.path作為cache_key:
@app.route("/get_info") @cache.cached() def get_info():print "no cache"return "it is ok!"- 1
- 2
- 3
- 4
- 5
@cache.cached()裝飾器還可以接收參數(shù),如參數(shù)timeout設置緩存過期時間;參數(shù)unless接收一個Bool類型的值,如果設置為True將不會使用緩存機制;參數(shù)key_prefix替換默認的cache_key
緩存其他函數(shù)
使用@cache.cached()裝飾器可以緩存其它非視圖相關函數(shù)的結果,當使用@cache.cached()裝飾器緩存非視圖相關函數(shù)的結果時,建議傳入?yún)?shù)key_prefix來替換默認的cache_key,否則它將會默認使用request.path作為cache_key:
@cache.cached(timeout=30,key_prefix="aaa") def sum_data(a,b):return int(a) + int(b)- 1
- 2
- 3
memoize()
在@cache.memoize()裝飾器中,函數(shù)的參數(shù)也包含在cache_key中:
@cache.memoize(timeout=30) def sum_data(a,b):return int(a) + int(b)- 1
- 2
- 3
值得注意的是,對于不接收參數(shù)的函數(shù)來說,@cache.memoize()與@cache.cached()是一樣的
清除緩存
以下是一個用于清除應用程序緩存的示例腳本:
from manager import app,cachewith app.app_context():cache.clear()- 1
- 2
- 3
- 4
配置
Flask-Cache支持多個類型作為緩存后端,不同的緩存后端,配置項也不盡相同,接下來記錄一下Flask-Cache支持的緩存后端:
- null:無緩存。相關配置項如下:
| CACHE_ARGS | 在緩存類實例化過程中解包和傳遞的可選列表 |
| CACHE_OPTIONS | 可選字典在緩存類實例化期間傳遞 |
-?simple:使用本地python字典進行存儲,這不是線程安全的。相關配置項如下:
| CACHE_DEFAULT_TIMEOUT | 默認過期/超時時間,單位為秒 |
| CACHE_THRESHOLD | 緩存的最大條目數(shù) |
| CACHE_ARGS | 在緩存類實例化過程中解包和傳遞的可選列表 |
| CACHE_OPTIONS | 可選字典在緩存類實例化期間傳遞 |
-?filesystem:使用文件系統(tǒng)來存儲緩存的值。相關配置項如下:
| CACHE_DEFAULT_TIMEOUT | 默認過期/超時時間,單位為秒 |
| CACHE_DIR | 存儲緩存的目錄 |
| CACHE_THRESHOLD | 緩存的最大條目數(shù) |
| CACHE_ARGS | 在緩存類實例化過程中解包和傳遞的可選列表 |
| CACHE_OPTIONS | 可選字典在緩存類實例化期間傳遞 |
-?memcached:使用memcached服務器作為緩存后端,支持pylibmc或memcache或Google應用程序引擎memcache庫。相關配置項如下:
| CACHE_DEFAULT_TIMEOUT | 默認過期/超時時間,單位為秒 |
| CACHE_KEY_PREFIX | 設置cache_key的前綴 |
| CAHCE_MEMCACHED_SERVERS | 服務器地址的列表或元組 |
| CACHE_ARGS | 在緩存類實例化過程中解包和傳遞的可選列表 |
| CACHE_OPTIONS | 可選字典在緩存類實例化期間傳遞 |
-?redis:使用Redis作為緩存后端。相關配置項如下:
| CACHE_DEFAULT_TIMEOUT | 默認過期/超時時間,單位為秒 |
| CACHE_KEY_PREFIX | 設置cache_key的前綴 |
| CACHE_REDIS_HOST | redis地址 |
| CACHE_REDIS_PORT | redis端口 |
| CACHE_REDIS_PASSWORD | redis密碼 |
| CACHE_REDIS_DB | 使用哪個庫 |
| CACHE_REDIS_URL | 連接到Redis服務器的URL。示例redis://user:password@localhost:6379/2 |
| CACHE_ARGS | 在緩存類實例化過程中解包和傳遞的可選列表 |
| CACHE_OPTIONS | 可選字典在緩存類實例化期間傳遞 |
舉個栗子:
from flask import Flask from flask_cache improt Cacheapp = Flask(__name__) cache = Cache(app,config={"CACHE_TYPE":"redis","CACHE_REDIS_HOST":"192.168.0.158","CACHE_REDIS_PORT":6379,"CACHE_REDIS_PASSWORD":"123456","CACHE_REDIS_DB":2 })@app.route("/get_info") @cache.cached(timeout=30) def get_info():print "no cache!"return "it is ok!"if __name__ == "__main__":app.run()- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- saslmemcached:使用memcached服務器作為緩存后端,打算與支持SASL的連接一起使用到memcached服務器。pylibmc是必須的,SASL必須由libmemcached支持。相關配置項如下:
| CACHE_DEFAULT_TIMEOUT | 默認過期/超時時間,單位為秒 |
| CACHE_KEY_PREFIX | 設置cache_key的前綴 |
| CAHCE_MEMCACHED_SERVERS | 服務器地址的列表或元組 |
| CACHE_MEMCACHED_USERNAME | 使用memcached進行SASL認證的用戶名 |
| CACHE_MEMCACHED_PASSWORD | 使用memcached進行SASL認證的密碼 |
| CACHE_ARGS | 在緩存類實例化過程中解包和傳遞的可選列表 |
| CACHE_OPTIONS | 可選字典在緩存類實例化期間傳遞 |
總結
以上是生活随笔為你收集整理的Flask-Cache的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http/https监控获取响应时间(D
- 下一篇: Elasticsearch笔记(七):聚