詳解python中flask_caching庫的用法
為了盡量減少緩存穿透,并同時減少web的響應(yīng)時間,可以針對那些需要一定時間才能獲取結(jié)果的函數(shù)和那些不需要頻繁更新的視圖函數(shù)提供緩存服務(wù),可以在一定的時間內(nèi)直接返回結(jié)果而不是每次都需要計算或者從數(shù)據(jù)庫中查找。flask_caching插件就是提供這種功能的神器。
安裝flask_caching庫:
pip install flask_caching
緩存類型
flask-caching內(nèi)置的緩存類型CACHE_TYPE有:NullCache、SimpleCache、FileSystemCache、RedisCache、RedisSentinelCache、RedisClusterCache、UWSGICache、MemcachedCache、SASLMemcachedCache和SpreadSASLMemcachedCache(在Flask-Caching2.0中刪除)。
NullCache:無緩存,其配置參數(shù)可以有:
- CACHE_NO_NULL_WARNING:不會拋出警告信息;
- CACHE_DEFAULT_TIMEOUT:如果未指定超時,則使用默認(rèn)超時,時間單位是秒。
SimpleCache:使用本地python字典進行存儲,非線程安全,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時,則使用默認(rèn)超時,時間單位是秒;
- CACHE_THRESHOLD:最大緩存數(shù);
- CACHE_IGNORE_ERRORS:其值為True時,在刪除過程中發(fā)生的任何錯誤將被忽略;其值為False時,在刪除過程中第一個錯誤時停止刪除;
FileSystemCache:使用文件系統(tǒng)來存儲緩存的值,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時,則使用默認(rèn)超時,時間單位是秒;
- CACHE_IGNORE_ERRORS:其值為True時,在刪除過程中發(fā)生的任何錯誤將被忽略;其值為False時,在刪除過程中第一個錯誤時停止刪除;
- CACHE_DIR:存儲緩存的目錄;
- CACHE_THRESHOLD:最大緩存數(shù);
- CACHE_OPTIONS:在緩存類實例化期間傳遞的可選字典。
RedisCache:使用Redis作為緩存后端,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時,則使用默認(rèn)超時,時間單位是秒;
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_OPTIONS:在緩存類實例化期間傳遞的可選字典;
- CACHE_REDIS_HOST:Redis 服務(wù)器主機;
- CACHE_REDIS_PORT:Redis 服務(wù)器端口,默認(rèn)為 6379;
- CACHE_REDIS_PASSWORD:服務(wù)器的 Redis 密碼;
- CACHE_REDIS_DB :Redis db(從零開始的數(shù)字索引),默認(rèn)為 0;
- CACHE_REDIS_URL:| 連接到 Redis 服務(wù)器的 URL,例子redis://user:password@localhost:6379/2 。
RedisSentinelCache:使用Redis哨兵模型緩存,其配置參數(shù)可以有:
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_REDIS_SENTINELS:Redis哨兵地址的列表或元組;
- CACHE_REDIS_SENTINEL_MASTER:哨兵配置中的主服務(wù)器的名稱
- CACHE_REDIS_PASSWORD:服務(wù)器的 Redis 密碼;
- CACHE_REDIS_DB:Redis db(從零開始的數(shù)字索引),默認(rèn)為 0。
RedisClusterCache:使用Redis自動分區(qū)緩存,其配置參數(shù)可以有:
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_REDIS_CLUSTER:一串以逗號分隔的 Redis 集群節(jié)點地址;
- CACHE_REDIS_PASSWORD:服務(wù)器的 Redis 密碼。
MemcachedCache:使用memcached服務(wù)器作為緩存后端,支持pylibmc或memcache或Google應(yīng)用程序引擎memcache庫,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時,則使用默認(rèn)超時,時間單位是秒;
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_MEMCACHED_SERVERS:服務(wù)器地址的列表或元組。
- 注意:Flask-Caching不會將額外的配置選項傳遞給memcached后端,要向這些緩存添加其他配置。
SASLMemcachedCache:啟用SASL的memcached服務(wù)器作為緩存后端,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時,則使用默認(rèn)超時,時間單位是秒;
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_OPTIONS:在緩存類實例化期間傳遞的可選字典;
- CACHE_MEMCACHED_SERVERS:服務(wù)器地址的列表或元組;
- CACHE_MEMCACHED_USERNAME:使用memcached進行SASL身份驗證的用戶名;
- CACHE_MEMCACHED_PASSWORD:使用memcached進行SASL身份驗證的密碼。
UWSGICache:使用uwsgi服務(wù)器作為緩存,其配置參數(shù)可以有:
- CACHE_UWSGI_NAME:要連接的uwsgi緩存實例的名稱,例如:mycache @ localhost :3031,默認(rèn)為空字符串;
注意:該UWSGICache沒有維護也沒有測試,不建議使用。
配置參數(shù)
CACHE_TYPE:設(shè)置緩存的類型 # 下面五個參數(shù)是所有的類型共有的 CACHE_NO_NULL_WARNING = "warning" # null類型時的警告消息 CACHE_ARGS = [] # 在緩存類實例化過程中解包和傳遞的可選列表,用來配置相關(guān)后端的額外的參數(shù) CACHE_OPTIONS = {} # 可選字典,在緩存類實例化期間傳遞,也是用來配置相關(guān)后端的額外的鍵值對參數(shù) CACHE_DEFAULT_TIMEOUT # 默認(rèn)過期/超時時間,單位為秒 CACHE_THRESHOLD # 緩存的最大條目數(shù) CACHE_TYPE = null # 默認(rèn)的緩存類型,無緩存 CACHE_TYPE = 'simple' # 使用本地python字典進行存儲,線程非安全 CACHE_TYPE = 'filesystem' # 使用文件系統(tǒng)來存儲緩存的值 CACHE_DIR = "" # 文件目錄 CACHE_TYPE = 'memcached' # 使用memcached服務(wù)器緩存 CACHE_KEY_PREFIX # 設(shè)置cache_key的前綴 CAHCE_MEMCACHED_SERVERS # 服務(wù)器地址的列表或元組 CACHE_MEMCACHED_USERNAME # 用戶名 CACHE_MEMCACHED_PASSWORD # 密碼 CACHE_TYPE = 'uwsgi' # 使用uwsgi服務(wù)器作為緩存 CACHE_UWSGI_NAME # 要連接的uwsgi緩存實例的名稱 CACHE_TYPE = 'redis' # 使用redis作為緩存 CACHE_KEY_PREFIX # 設(shè)置cache_key的前綴 CACHE_REDIS_HOST # redis地址 CACHE_REDIS_PORT # redis端口 CACHE_REDIS_PASSWORD # redis密碼 CACHE_REDIS_DB # 使用哪個數(shù)據(jù)庫 # 也可以一鍵配置 CACHE_REDIS_URL 連接到Redis服務(wù)器的URL。示例redis://user:password@localhost:6379/2
初始化
以緩存類型為RedisCache為例:
from flask import Flask from flask_caching import Cache import time # 配置RedisCache緩存類型參數(shù)值,使用本地的redis,沒有密碼 config = { 'CACHE_TYPE': 'redis', # 使用redis作為緩存 'CACHE_REDIS_HOST': '127.0.0.1', # redis地址 'CACHE_REDIS_PORT': 6379 # redis端口號 } # simple # cache = Cache(app, config={'CACHE_TYPE': 'simple'}) app = Flask(__name__) # 初始化緩存 cache = Cache(app=app, config=config) # 創(chuàng)建Cache對象 # 或使用init_app()初始化緩存 # cache = Cache() # 創(chuàng)建Cache對象 # cache.init_app(app=app, config=config) @app.route('/') def index(): return 'hello world!' if __name__ == '__main__': app.run()
Cache對象的主要方法有:
#裝飾器,裝飾無參數(shù)函數(shù),緩存該函數(shù) @cache.cached(timeout=None, key_prefix=None, unless=None, forced_update=None, query_string=False)
其中:timeout為超時時間;
可選參數(shù)有:
- key_prefix:緩存指定的函數(shù);
- unless:是否啟用緩存,如果為True,不啟用緩存;
- forced_update:緩存是否實時更新,如果為True,無論是否過期都將更新緩存;
- query_string:為True時,緩存鍵是先將參數(shù)排序然后哈希的結(jié)果。
#裝飾器,裝飾有參數(shù)函數(shù),緩存該函數(shù) @cache.memoize(timeout=None, make_name=None, unless=None, forced_update=None, query_string=False)
與cache.cached()方法類似,區(qū)別為cache.memoize有make_name,其作用是設(shè)置函數(shù)的標(biāo)志,如果沒有就使用裝飾的函數(shù)。
使用緩存
為了能更好地體現(xiàn)效果,通過設(shè)置休眠時間來模擬數(shù)據(jù)加載時間。
示例代碼:
from flask import Flask from flask_caching import Cache import time # 配置RedisCache緩存類型參數(shù)值,使用本地的redis,沒有密碼 config = { 'CACHE_TYPE': 'redis', # 使用redis作為緩存 'CACHE_REDIS_HOST': '127.0.0.1', # redis地址 'CACHE_REDIS_PORT': 6379 # redis端口號 } app = Flask(__name__) # 初始化緩存 cache = Cache(app=app, config=config) # 創(chuàng)建Cache對象 # 或使用init_app()初始化緩存 # cache = Cache() # 創(chuàng)建Cache對象 # cache.init_app(app=app, config=config) @app.route('/') @cache.cached(timeout=200) # 設(shè)置超時時間 def index(): time.sleep(5) return 'hello world!' if __name__ == '__main__': app.run()
在緩存對象中,我們可以使用以下代碼來設(shè)置、獲取、刪除緩存對象:
# 設(shè)置 cache.set(key, value, timeout=None) # 設(shè)置一個緩存對象 cache.set_many({key: value, key: value, ..., key: value}, timeout=None) # 設(shè)置多個緩存對象 # 獲取 cache.get(key) # 獲取一個緩存對象 cache.get_many(key1, key2, ....) # 獲取多個緩存對象 # 刪除 cache.get.delete(key) # 刪除一個緩存對象 cache_delete_many(key1, key2, ...) # 刪除多個緩存對象 cache.clear() # 刪除所有緩存對象
示例代碼:
from flask import Flask from flask_caching import Cache # 配置RedisCache緩存類型參數(shù)值,使用本地的redis,沒有密碼 config = { 'CACHE_TYPE': 'redis', # 使用redis作為緩存 'CACHE_REDIS_HOST': '127.0.0.1', # redis地址 'CACHE_REDIS_PORT': 6379 # redis端口號 } app = Flask(__name__) # 初始化緩存 cache = Cache(app=app, config=config) # 創(chuàng)建Cache對象 # 或使用init_app()初始化緩存 # cache = Cache() # 創(chuàng)建Cache對象 # cache.init_app(app=app, config=config) @app.route('/') def index(): cache.set('name', '王五', timeout=30) # 設(shè)置鍵為name,value為小明,超時時間為30秒的緩存對象 print(cache.get('name')) # 打印鍵為name的緩存對象值 cache.set_many({'name1': '李四', 'name2': '張三'}, timeout=30) # 設(shè)置多個緩存對象 print(cache.get_many("name1", "name2")) # 打印多個緩存對象值 print(cache.delete("name")) # 刪除鍵為name的緩存對象 print(cache.delete_many("name1", "name2")) # 刪除多個緩存對象 print(cache.get_many("name1", "name2")) # 打印多個緩存對象值 return '緩存對象' if __name__ == '__main__': app.run()
運行結(jié)果:
示例代碼:
from flask import Flask, request from flask_caching import Cache app = Flask(__name__) # simple使用字典存儲 cache = Cache(app, config={'CACHE_TYPE': 'simple'}) @app.route('/') @cache.cached(timeout=20) def index(): print(request.path) s = 'test cache' cache.set('b', 123) print('test cache') return s @app.route('/test') def test(): print(cache.get('b')) return 'ok' if __name__ == '__main__': app.run()
運行結(jié)果:
更多flask_caching用法詳見官方網(wǎng)址:Flask-Caching — Flask-Caching 1.0.0 documentation
到此這篇關(guān)于詳解python中flask_caching庫的用法的文章就介紹到這了,更多相關(guān)python中flask_caching庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python創(chuàng)造虛擬環(huán)境方法總結(jié)
在本篇內(nèi)容里我們給大家整理了關(guān)于python創(chuàng)造虛擬環(huán)境的詳細(xì)方法和步驟,需要的朋友們學(xué)習(xí)下。2019-03-03Python 如何定義匿名或內(nèi)聯(lián)函數(shù)
這篇文章主要介紹了Python 如何定義匿名或內(nèi)聯(lián)函數(shù),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08一起來學(xué)習(xí)一下python的數(shù)據(jù)類型
這篇文章主要為大家詳細(xì)介紹了python的數(shù)據(jù)類型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下希望能夠給你帶來幫助2022-01-01