詳解python中flask_caching庫(kù)的用法
為了盡量減少緩存穿透,并同時(shí)減少web的響應(yīng)時(shí)間,可以針對(duì)那些需要一定時(shí)間才能獲取結(jié)果的函數(shù)和那些不需要頻繁更新的視圖函數(shù)提供緩存服務(wù),可以在一定的時(shí)間內(nèi)直接返回結(jié)果而不是每次都需要計(jì)算或者從數(shù)據(jù)庫(kù)中查找。flask_caching插件就是提供這種功能的神器。
安裝flask_caching庫(kù):
pip install flask_caching

緩存類型
flask-caching內(nèi)置的緩存類型CACHE_TYPE有:NullCache、SimpleCache、FileSystemCache、RedisCache、RedisSentinelCache、RedisClusterCache、UWSGICache、MemcachedCache、SASLMemcachedCache和SpreadSASLMemcachedCache(在Flask-Caching2.0中刪除)。
NullCache:無(wú)緩存,其配置參數(shù)可以有:
- CACHE_NO_NULL_WARNING:不會(huì)拋出警告信息;
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒。
SimpleCache:使用本地python字典進(jìn)行存儲(chǔ),非線程安全,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒;
- CACHE_THRESHOLD:最大緩存數(shù);
- CACHE_IGNORE_ERRORS:其值為True時(shí),在刪除過(guò)程中發(fā)生的任何錯(cuò)誤將被忽略;其值為False時(shí),在刪除過(guò)程中第一個(gè)錯(cuò)誤時(shí)停止刪除;
FileSystemCache:使用文件系統(tǒng)來(lái)存儲(chǔ)緩存的值,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒;
- CACHE_IGNORE_ERRORS:其值為True時(shí),在刪除過(guò)程中發(fā)生的任何錯(cuò)誤將被忽略;其值為False時(shí),在刪除過(guò)程中第一個(gè)錯(cuò)誤時(shí)停止刪除;
- CACHE_DIR:存儲(chǔ)緩存的目錄;
- CACHE_THRESHOLD:最大緩存數(shù);
- CACHE_OPTIONS:在緩存類實(shí)例化期間傳遞的可選字典。
RedisCache:使用Redis作為緩存后端,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒;
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_OPTIONS:在緩存類實(shí)例化期間傳遞的可選字典;
- CACHE_REDIS_HOST:Redis 服務(wù)器主機(jī);
- CACHE_REDIS_PORT:Redis 服務(wù)器端口,默認(rèn)為 6379;
- CACHE_REDIS_PASSWORD:服務(wù)器的 Redis 密碼;
- CACHE_REDIS_DB :Redis db(從零開(kāi)始的數(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(從零開(kāi)始的數(shù)字索引),默認(rèn)為 0。
RedisClusterCache:使用Redis自動(dòng)分區(qū)緩存,其配置參數(shù)可以有:
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_REDIS_CLUSTER:一串以逗號(hào)分隔的 Redis 集群節(jié)點(diǎn)地址;
- CACHE_REDIS_PASSWORD:服務(wù)器的 Redis 密碼。
MemcachedCache:使用memcached服務(wù)器作為緩存后端,支持pylibmc或memcache或Google應(yīng)用程序引擎memcache庫(kù),其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒;
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_MEMCACHED_SERVERS:服務(wù)器地址的列表或元組。
- 注意:Flask-Caching不會(huì)將額外的配置選項(xiàng)傳遞給memcached后端,要向這些緩存添加其他配置。
SASLMemcachedCache:?jiǎn)⒂肧ASL的memcached服務(wù)器作為緩存后端,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒;
- CACHE_KEY_PREFIX:所有它都可以用于應(yīng)用程序的應(yīng)用程序使用相同的鍵;
- CACHE_OPTIONS:在緩存類實(shí)例化期間傳遞的可選字典;
- CACHE_MEMCACHED_SERVERS:服務(wù)器地址的列表或元組;
- CACHE_MEMCACHED_USERNAME:使用memcached進(jìn)行SASL身份驗(yàn)證的用戶名;
- CACHE_MEMCACHED_PASSWORD:使用memcached進(jìn)行SASL身份驗(yàn)證的密碼。
UWSGICache:使用uwsgi服務(wù)器作為緩存,其配置參數(shù)可以有:
- CACHE_UWSGI_NAME:要連接的uwsgi緩存實(shí)例的名稱,例如:mycache @ localhost :3031,默認(rèn)為空字符串;
注意:該UWSGICache沒(méi)有維護(hù)也沒(méi)有測(cè)試,不建議使用。
配置參數(shù)
CACHE_TYPE:設(shè)置緩存的類型
# 下面五個(gè)參數(shù)是所有的類型共有的
CACHE_NO_NULL_WARNING = "warning" # null類型時(shí)的警告消息
CACHE_ARGS = [] # 在緩存類實(shí)例化過(guò)程中解包和傳遞的可選列表,用來(lái)配置相關(guān)后端的額外的參數(shù)
CACHE_OPTIONS = {} # 可選字典,在緩存類實(shí)例化期間傳遞,也是用來(lái)配置相關(guān)后端的額外的鍵值對(duì)參數(shù)
CACHE_DEFAULT_TIMEOUT # 默認(rèn)過(guò)期/超時(shí)時(shí)間,單位為秒
CACHE_THRESHOLD # 緩存的最大條目數(shù)
CACHE_TYPE = null # 默認(rèn)的緩存類型,無(wú)緩存
CACHE_TYPE = 'simple' # 使用本地python字典進(jìn)行存儲(chǔ),線程非安全
CACHE_TYPE = 'filesystem' # 使用文件系統(tǒng)來(lái)存儲(chǔ)緩存的值
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緩存實(shí)例的名稱
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 # 使用哪個(gè)數(shù)據(jù)庫(kù)
# 也可以一鍵配置
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,沒(méi)有密碼
config = {
'CACHE_TYPE': 'redis', # 使用redis作為緩存
'CACHE_REDIS_HOST': '127.0.0.1', # redis地址
'CACHE_REDIS_PORT': 6379 # redis端口號(hào)
}
# simple
# cache = Cache(app, config={'CACHE_TYPE': 'simple'})
app = Flask(__name__)
# 初始化緩存
cache = Cache(app=app, config=config) # 創(chuàng)建Cache對(duì)象
# 或使用init_app()初始化緩存
# cache = Cache() # 創(chuàng)建Cache對(duì)象
# cache.init_app(app=app, config=config)
@app.route('/')
def index():
return 'hello world!'
if __name__ == '__main__':
app.run()Cache對(duì)象的主要方法有:
#裝飾器,裝飾無(wú)參數(shù)函數(shù),緩存該函數(shù) @cache.cached(timeout=None, key_prefix=None, unless=None, forced_update=None, query_string=False)
其中:timeout為超時(shí)時(shí)間;
可選參數(shù)有:
- key_prefix:緩存指定的函數(shù);
- unless:是否啟用緩存,如果為True,不啟用緩存;
- forced_update:緩存是否實(shí)時(shí)更新,如果為True,無(wú)論是否過(guò)期都將更新緩存;
- query_string:為True時(shí),緩存鍵是先將參數(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)志,如果沒(méi)有就使用裝飾的函數(shù)。
使用緩存
為了能更好地體現(xiàn)效果,通過(guò)設(shè)置休眠時(shí)間來(lái)模擬數(shù)據(jù)加載時(shí)間。
示例代碼:
from flask import Flask
from flask_caching import Cache
import time
# 配置RedisCache緩存類型參數(shù)值,使用本地的redis,沒(méi)有密碼
config = {
'CACHE_TYPE': 'redis', # 使用redis作為緩存
'CACHE_REDIS_HOST': '127.0.0.1', # redis地址
'CACHE_REDIS_PORT': 6379 # redis端口號(hào)
}
app = Flask(__name__)
# 初始化緩存
cache = Cache(app=app, config=config) # 創(chuàng)建Cache對(duì)象
# 或使用init_app()初始化緩存
# cache = Cache() # 創(chuàng)建Cache對(duì)象
# cache.init_app(app=app, config=config)
@app.route('/')
@cache.cached(timeout=200) # 設(shè)置超時(shí)時(shí)間
def index():
time.sleep(5)
return 'hello world!'
if __name__ == '__main__':
app.run()在緩存對(duì)象中,我們可以使用以下代碼來(lái)設(shè)置、獲取、刪除緩存對(duì)象:
# 設(shè)置
cache.set(key, value, timeout=None) # 設(shè)置一個(gè)緩存對(duì)象
cache.set_many({key: value, key: value, ..., key: value}, timeout=None) # 設(shè)置多個(gè)緩存對(duì)象
# 獲取
cache.get(key) # 獲取一個(gè)緩存對(duì)象
cache.get_many(key1, key2, ....) # 獲取多個(gè)緩存對(duì)象
# 刪除
cache.get.delete(key) # 刪除一個(gè)緩存對(duì)象
cache_delete_many(key1, key2, ...) # 刪除多個(gè)緩存對(duì)象
cache.clear() # 刪除所有緩存對(duì)象示例代碼:
from flask import Flask
from flask_caching import Cache
# 配置RedisCache緩存類型參數(shù)值,使用本地的redis,沒(méi)有密碼
config = {
'CACHE_TYPE': 'redis', # 使用redis作為緩存
'CACHE_REDIS_HOST': '127.0.0.1', # redis地址
'CACHE_REDIS_PORT': 6379 # redis端口號(hào)
}
app = Flask(__name__)
# 初始化緩存
cache = Cache(app=app, config=config) # 創(chuàng)建Cache對(duì)象
# 或使用init_app()初始化緩存
# cache = Cache() # 創(chuàng)建Cache對(duì)象
# cache.init_app(app=app, config=config)
@app.route('/')
def index():
cache.set('name', '王五', timeout=30) # 設(shè)置鍵為name,value為小明,超時(shí)時(shí)間為30秒的緩存對(duì)象
print(cache.get('name')) # 打印鍵為name的緩存對(duì)象值
cache.set_many({'name1': '李四', 'name2': '張三'}, timeout=30) # 設(shè)置多個(gè)緩存對(duì)象
print(cache.get_many("name1", "name2")) # 打印多個(gè)緩存對(duì)象值
print(cache.delete("name")) # 刪除鍵為name的緩存對(duì)象
print(cache.delete_many("name1", "name2")) # 刪除多個(gè)緩存對(duì)象
print(cache.get_many("name1", "name2")) # 打印多個(gè)緩存對(duì)象值
return '緩存對(duì)象'
if __name__ == '__main__':
app.run()運(yùn)行結(jié)果:

示例代碼:
from flask import Flask, request
from flask_caching import Cache
app = Flask(__name__)
# simple使用字典存儲(chǔ)
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()運(yùn)行結(jié)果:

更多flask_caching用法詳見(jiàn)官方網(wǎng)址:Flask-Caching — Flask-Caching 1.0.0 documentation
到此這篇關(guān)于詳解python中flask_caching庫(kù)的用法的文章就介紹到這了,更多相關(guān)python中flask_caching庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3.x實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了python3.x實(shí)現(xiàn)發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Python3與redis交互,保存的是字符串,取出來(lái)是bytes類型問(wèn)題
這篇文章主要介紹了Python3與redis交互,保存的是字符串,取出來(lái)是bytes類型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-09-09
淺談keras中的batch_dot,dot方法和TensorFlow的matmul
這篇文章主要介紹了淺談keras中的batch_dot,dot方法和TensorFlow的matmul,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
淺談基于Pytest框架的自動(dòng)化測(cè)試開(kāi)發(fā)實(shí)踐
Pytest是Python的一種易用、高效和靈活的單元測(cè)試框架,本文主要介紹了基于Pytest框架的自動(dòng)化測(cè)試開(kāi)發(fā)實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Python 實(shí)用技巧之利用Shell通配符做字符串匹配
這篇文章主要介紹了Python 實(shí)用技巧之利用Shell通配符做字符串匹配的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
使用Python來(lái)開(kāi)發(fā)Markdown腳本擴(kuò)展的實(shí)例分享
這篇文章主要介紹了使用Python來(lái)開(kāi)發(fā)Markdown腳本擴(kuò)展的實(shí)例分享,文中的示例是用來(lái)簡(jiǎn)單地轉(zhuǎn)換文檔結(jié)構(gòu),主要為了體現(xiàn)一個(gè)思路,需要的朋友可以參考下2016-03-03

