詳解python中flask_caching庫的用法
為了盡量減少緩存穿透,并同時(shí)減少web的響應(yīng)時(shí)間,可以針對(duì)那些需要一定時(shí)間才能獲取結(jié)果的函數(shù)和那些不需要頻繁更新的視圖函數(shù)提供緩存服務(wù),可以在一定的時(shí)間內(nèi)直接返回結(jié)果而不是每次都需要計(jì)算或者從數(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:不會(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í),在刪除過程中發(fā)生的任何錯(cuò)誤將被忽略;其值為False時(shí),在刪除過程中第一個(gè)錯(cuò)誤時(shí)停止刪除;
FileSystemCache:使用文件系統(tǒng)來存儲(chǔ)緩存的值,其配置參數(shù)可以有:
- CACHE_DEFAULT_TIMEOUT:如果未指定超時(shí),則使用默認(rèn)超時(shí),時(shí)間單位是秒;
- CACHE_IGNORE_ERRORS:其值為True時(shí),在刪除過程中發(fā)生的任何錯(cuò)誤將被忽略;其值為False時(shí),在刪除過程中第一個(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(從零開始的數(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自動(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庫,其配置參數(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:啟用SASL的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沒有維護(hù)也沒有測試,不建議使用。
配置參數(shù)
CACHE_TYPE:設(shè)置緩存的類型
# 下面五個(gè)參數(shù)是所有的類型共有的
CACHE_NO_NULL_WARNING = "warning" # null類型時(shí)的警告消息
CACHE_ARGS = [] # 在緩存類實(shí)例化過程中解包和傳遞的可選列表,用來配置相關(guān)后端的額外的參數(shù)
CACHE_OPTIONS = {} # 可選字典,在緩存類實(shí)例化期間傳遞,也是用來配置相關(guān)后端的額外的鍵值對(duì)參數(shù)
CACHE_DEFAULT_TIMEOUT # 默認(rèn)過期/超時(shí)時(shí)間,單位為秒
CACHE_THRESHOLD # 緩存的最大條目數(shù)
CACHE_TYPE = null # 默認(rèn)的緩存類型,無緩存
CACHE_TYPE = 'simple' # 使用本地python字典進(jìn)行存儲(chǔ),線程非安全
CACHE_TYPE = 'filesystem' # 使用文件系統(tǒng)來存儲(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ù)庫
# 也可以一鍵配置
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端口號(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ì)象的主要方法有:
#裝飾器,裝飾無參數(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,無論是否過期都將更新緩存;
- 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)志,如果沒有就使用裝飾的函數(shù)。
使用緩存
為了能更好地體現(xiàn)效果,通過設(shè)置休眠時(shí)間來模擬數(shù)據(jù)加載時(shí)間。
示例代碼:
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端口號(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ì)象中,我們可以使用以下代碼來設(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,沒有密碼
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用法詳見官方網(wǎng)址:Flask-Caching — Flask-Caching 1.0.0 documentation
到此這篇關(guān)于詳解python中flask_caching庫的用法的文章就介紹到這了,更多相關(guān)python中flask_caching庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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-03
Python 如何定義匿名或內(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ì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下希望能夠給你帶來幫助2022-01-01

