W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
緩存系統(tǒng)需要少量的設(shè)置。也就是說(shuō),你必須告訴它你的緩存數(shù)據(jù)應(yīng)該放在哪里 —— 是在數(shù)據(jù)庫(kù)中,還是在文件系統(tǒng)上,或者直接放在內(nèi)存中。這是一個(gè)重要的決定,會(huì)影響你的緩存的性能;是的,有些緩存類型比其他類型快。
緩存設(shè)置項(xiàng)位于你的配置文件的緩存配置中。這里有緩存配置所有可用值的說(shuō)明。
?Memcached
?是一個(gè)完全基于內(nèi)存的緩存服務(wù)器,最初開(kāi)發(fā)用于處理 LiveJournal.com 的高負(fù)載,隨后由 Danga Interactive 開(kāi)源。 Facebook 和 Wikipedia 等網(wǎng)站使用它來(lái)減少數(shù)據(jù)庫(kù)訪問(wèn)并顯著提高網(wǎng)站性能。
?Memcached
?以一個(gè)守護(hù)進(jìn)程的形式運(yùn)行,并且被分配了指定數(shù)量的 RAM。它所做的就是提供一個(gè)快速接口用于在緩存中添加,檢索和刪除數(shù)據(jù)。所有數(shù)據(jù)都直接存儲(chǔ)在內(nèi)存中,因此不會(huì)產(chǎn)生數(shù)據(jù)庫(kù)或文件系統(tǒng)使用的開(kāi)銷(xiāo)。
在安裝了 ?Memcached
?本身之后,你需要安裝一個(gè) ?Memcached
?綁定。有幾個(gè) Python ?Memcached
?綁定可用;Django 支持的兩個(gè)綁定是 ?pylibmc
?和 ?pymemcache
?。
在 Django 中使用 ?Memcached
?:
設(shè)置 ?BACKEND
?為 ?django.core.cache.backends.memcached.PyMemcacheCache
? 或 ?django.core.cache.backends.memcached.PyLibMCCache
? (取決于你選擇的 ?memcached
?綁定)。
將 ?LOCATION
?設(shè)置為 ?ip:port
? 值,其中 ?ip
?是 ?Memcached
?守護(hù)進(jìn)程的 ?IP
?地址,?port
?是 ?Memcached
?運(yùn)行的端口,或者設(shè)置為 ?unix:path
? 值,其中 ?path
?是 ?Memcached Unix socket
? 文件的路徑。
在這個(gè)例子中,?Memcached
?運(yùn)行在 localhost(127.0.0.1)端口 11211,使用 ?pymemcache
?綁定:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
}
}
在這個(gè)例子中,?Memcached
?可以通過(guò)本地 ?Unix
?套接字文件 ?/tmp/memcached.sock
? 使用 ?pymemcache
?綁定:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': 'unix:/tmp/memcached.sock',
}
}
?Memcached
?有一個(gè)很好的特性,就是它可以在多臺(tái)服務(wù)器上共享一個(gè)緩存。這意味著你可以在多臺(tái)機(jī)器上運(yùn)行 ?Memcached
?守護(hù)進(jìn)程,程序?qū)堰@組機(jī)器作為一個(gè) 單一 的緩存,而不需要在每臺(tái)機(jī)器上重復(fù)緩存值。要利用這個(gè)特性,請(qǐng)?jiān)??LOCATION
?中包含所有服務(wù)器地址,可以是分號(hào)或逗號(hào)分隔的字符串,也可以是一個(gè)列表。
在這個(gè)例子中,緩存是通過(guò)運(yùn)行在 IP 地址 172.19.26.240 和 172.19.26.242 上的 ?Memcached
?實(shí)例共享的,這兩個(gè)實(shí)例都在 11211 端口上:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
在下面的例子中,緩存是由運(yùn)行在 IP 地址 172.19.26.240(端口11211)、172.19.26.242(端口11212)和 172.19.26.244(端口11213)上的 ?Memcached
?實(shí)例共享的:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11212',
'172.19.26.244:11213',
]
}
}
關(guān)于 ?Memcached
?的最后一點(diǎn)是,基于內(nèi)存的緩存有一個(gè)缺點(diǎn):因?yàn)榫彺娴臄?shù)據(jù)存儲(chǔ)在內(nèi)存中,如果你的服務(wù)器崩潰,數(shù)據(jù)將丟失。顯然,內(nèi)存并不是用來(lái)永久存儲(chǔ)數(shù)據(jù)的,所以不要依賴基于內(nèi)存的緩存作為你唯一的數(shù)據(jù)存儲(chǔ)。毫無(wú)疑問(wèn),Django 緩存后端中的 每個(gè) 都不應(yīng)該用于永久存儲(chǔ) —— 它們的目的都是為了緩存的解決方案,而不是存儲(chǔ) —— 但我們?cè)谶@里指出這一點(diǎn)是因?yàn)榛趦?nèi)存的緩存是格外臨時(shí)的。
Redis 是一個(gè)可用于緩存的內(nèi)存數(shù)據(jù)庫(kù)。 首先,您需要一個(gè)在本地或遠(yuǎn)程機(jī)器上運(yùn)行的 Redis 服務(wù)器。
設(shè)置 Redis 服務(wù)器后,您需要為 Redis 安裝 Python 綁定。 redis-py 是 Django 原生支持的綁定。 還建議安裝額外的hiredis-py 包。
使用 Redis 作為 Django 的緩存后端:
BACKEND
?設(shè)置為 ?django.core.cache.backends.redis.RedisCache
?LOCATION
?設(shè)置為指向您的 Redis 實(shí)例的 URL。例如,如果 Redis 在 localhost (127.0.0.1) 端口 6379 上運(yùn)行:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379',
}
}
Redis 服務(wù)器通常受到身份驗(yàn)證的保護(hù)。 為了提供用戶名和密碼,請(qǐng)將它們與 URL 一起添加到 ?LOCATION
?:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://username:password@127.0.0.1:6379',
}
}
如果您在復(fù)制模式下設(shè)置了多個(gè) Redis 服務(wù)器,則可以將服務(wù)器指定為分號(hào)或逗號(hào)分隔的字符串,或者作為列表。 使用多臺(tái)服務(wù)器時(shí),寫(xiě)入操作在第一臺(tái)服務(wù)器(領(lǐng)導(dǎo)者)上執(zhí)行。 讀取操作在隨機(jī)選擇的其他服務(wù)器(副本)上執(zhí)行:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': [
'redis://127.0.0.1:6379', # leader
'redis://127.0.0.1:6378', # read-replica 1
'redis://127.0.0.1:6377', # read-replica 2
],
}
}
Django 可以在數(shù)據(jù)庫(kù)中存儲(chǔ)緩存數(shù)據(jù)。如果你有一個(gè)快速、索引正常的數(shù)據(jù)庫(kù)服務(wù)器,這種緩存效果最好。
用數(shù)據(jù)庫(kù)表作為你的緩存后端:
BACKEND
?設(shè)置為 ?django.core.cache.backends.db.DatabaseCache
?LOCATION
?設(shè)置為數(shù)據(jù)庫(kù)表的 ?tablename
?。這個(gè)表名可以是沒(méi)有使用過(guò)的任何符合要求的名稱。在這個(gè)例子中,緩存表的名稱是 ?my_cache_table
?:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
與其他緩存后端不同,數(shù)據(jù)庫(kù)緩存不支持在數(shù)據(jù)庫(kù)級(jí)別自動(dòng)剔除過(guò)期條目。 相反,每次調(diào)用 ?add()
?、?set()
? 或 ?touch()
? 時(shí)都會(huì)剔除過(guò)期的緩存條目。
使用數(shù)據(jù)庫(kù)緩存之前,必須通過(guò)下面的命令創(chuàng)建緩存表:
python manage.py createcachetable
這將在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表,該表的格式與 Django 數(shù)據(jù)庫(kù)緩存系統(tǒng)期望的一致。該表的表名取自 ?LOCATION
?。
如果你正在使用多個(gè)數(shù)據(jù)庫(kù)緩存, ?createcachetable
?會(huì)為每個(gè)緩存創(chuàng)建一個(gè)表。
如果你正在使用多個(gè)數(shù)據(jù)庫(kù), ?createcachetable
?觀察你的數(shù)據(jù)庫(kù)路由器的 ?allow_migrate()
?方法。
像 ?migrate
?一樣, ?createcachetable
?不會(huì)影響已經(jīng)存在的表,它只創(chuàng)建缺失的表。
要打印即將運(yùn)行的 SQL,而不是運(yùn)行它,請(qǐng)使用 ?createcachetable --dry-run
? 選項(xiàng)。
如果在多數(shù)據(jù)庫(kù)中使用緩存,你也需要設(shè)置數(shù)據(jù)庫(kù)緩存表的路由指令。因?yàn)槁酚傻脑?,?shù)據(jù)庫(kù)緩存表在 ?django_cache
?應(yīng)用程序中顯示為 ?CacheEntry
?的模型名。這個(gè)模型不會(huì)出現(xiàn)在模型緩存中,但模型詳情可用于路由目的。
比如,下面的路由可以將所有緩存讀取操作指向 ?cache_replica
?,并且所有的寫(xiě)操作指向 ?cache_primary
?。緩存表將會(huì)只同步到 ?cache_primary
?。
class CacheRouter:
"""A router to control all database cache operations"""
def db_for_read(self, model, **hints):
"All cache read operations go to the replica"
if model._meta.app_label == 'django_cache':
return 'cache_replica'
return None
def db_for_write(self, model, **hints):
"All cache write operations go to primary"
if model._meta.app_label == 'django_cache':
return 'cache_primary'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"Only install the cache model on primary"
if app_label == 'django_cache':
return db == 'cache_primary'
return None
如果你沒(méi)有指定路由指向數(shù)據(jù)庫(kù)緩存模型,緩存后端將使用 默認(rèn) 的數(shù)據(jù)庫(kù)。
如果沒(méi)使用數(shù)據(jù)庫(kù)緩存后端,則無(wú)需擔(dān)心為數(shù)據(jù)庫(kù)緩存模型提供路由指令。
基于文件的后端序列化并保存每個(gè)緩存值作為單獨(dú)的文件。要使用此后端,可將 ?BACKEND
?設(shè)置為 ?django.core.cache.backends.filebased.FileBasedCache
?并將 ?LOCATION
?設(shè)置為一個(gè)合適的路徑。比如,在 ?/var/tmp/django_cache
? 存儲(chǔ)緩存數(shù)據(jù),使用以下配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
如果使用 Windows 系統(tǒng),將驅(qū)動(dòng)器號(hào)放在路徑開(kāi)頭,如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': 'c:/foo/bar',
}
}
目錄路徑應(yīng)該是絕對(duì)路徑——因此,它應(yīng)該以文件系統(tǒng)根目錄開(kāi)始。無(wú)需擔(dān)心是否需要以斜杠結(jié)尾。
確保此設(shè)置指向的目錄存在并且可讀可寫(xiě),或者它可以由運(yùn)行 Web 服務(wù)器的系統(tǒng)用戶創(chuàng)建。 繼續(xù)上面的例子,如果你的服務(wù)器以用戶 ?apache
?運(yùn)行,確保目錄 ?/var/tmp/django_cache
? 存在并且用戶 ?apache
?可讀寫(xiě),或者它可以由用戶 ?apache
?創(chuàng)建。
當(dāng)緩存 ?LOCATION
?包含在 ?MEDIA_ROOT
?或 ?STATICFILES_FINDERS
?中,敏感數(shù)據(jù)可能被暴露。
獲得訪問(wèn)緩存文件的攻擊者不僅可以偽造 HTML 內(nèi)容,你的網(wǎng)站會(huì)信任它,而且還可以遠(yuǎn)程執(zhí)行任意代碼,因?yàn)閿?shù)據(jù)是用 ?pickle
?序列化的。
如果你的配置文件中沒(méi)有指定其他緩存,那么這是默認(rèn)的緩存。如果你想獲得內(nèi)存緩存的速度優(yōu)勢(shì),但又不具備運(yùn)行 ?Memcached
?的能力,可以考慮使用本地內(nèi)存緩存后端。這個(gè)緩存是每進(jìn)程所有和線程安全的。要使用它,可以將 ?BACKEND
?設(shè)置為 ?django.core.cache.backends.locmem.LocMemCache
?。例如:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
?LOCATION
?被用于標(biāo)識(shí)各個(gè)內(nèi)存存儲(chǔ)。如果只有一個(gè) ?locmem
?緩存,你可以忽略 ?LOCATION
? 。但是如果你有多個(gè)本地內(nèi)存緩存,那么你至少要為其中一個(gè)起個(gè)名字,以便將它們區(qū)分開(kāi)。
這種緩存使用最近最少使用(LRU)的淘汰策略。
請(qǐng)注意,每個(gè)進(jìn)程都會(huì)有自己的私有緩存實(shí)例,這意味著不可能進(jìn)行跨進(jìn)程緩存。這也意味著本地內(nèi)存緩存的內(nèi)存效率不是特別高,所以對(duì)于生產(chǎn)環(huán)境來(lái)說(shuō),它可能不是一個(gè)好的選擇。對(duì)于開(kāi)發(fā)來(lái)說(shuō)是不錯(cuò)的選擇。
最后,Django 帶有一個(gè)實(shí)際上不是緩存的 虛擬緩存,它只是實(shí)現(xiàn)緩存接口,并不做其他操作。
如果你有一個(gè)生產(chǎn)網(wǎng)站,在不同的地方使用了大量的緩存,但在開(kāi)發(fā)/測(cè)試環(huán)境中,你不想緩存,也不想單獨(dú)修改你的代碼,那么這就很有用。要激活虛擬緩存,可以像這樣設(shè)置 ?BACKEND
?:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
雖然 Django 包含了許多開(kāi)箱即用的緩存后端支持,但有時(shí)你可能會(huì)想使用一個(gè)自定義的緩存后端。要在 Django 中使用外部緩存后端,使用 Python 導(dǎo)入路徑作為 ?BACKEND
?的 ?CACHES
?配置中的 ?BACKEND
?,像這樣:
CACHES = {
'default': {
'BACKEND': 'path.to.backend',
}
}
如果你正在創(chuàng)建自己的后端,你可以使用標(biāo)準(zhǔn)緩存作為參考實(shí)現(xiàn)。你可以在 Django 源代碼的 ?django/core/cache/backends/
? 目錄找到代碼。
注意:除非是令人信服的理由,諸如服務(wù)器不支持緩存,否則你應(yīng)該使用 Django 附帶的緩存后端。他們經(jīng)過(guò)了良好的測(cè)試并有完整文檔。
每個(gè)緩存后端可以通過(guò)額外的參數(shù)來(lái)控制緩存行為。這些參數(shù)在 ?CACHES
?配置中作為附加鍵提供。有效參數(shù)如下:
TIMEOUT
?:緩存的默認(rèn)超時(shí)時(shí)間,以秒為單位。這個(gè)參數(shù)默認(rèn)為 300 秒(5 分鐘)。你可以將 ?TIMEOUT
?設(shè)置為 ?None
?,這樣,默認(rèn)情況下,緩存鍵永遠(yuǎn)不會(huì)過(guò)期。值為 0 會(huì)導(dǎo)致鍵立即過(guò)期(實(shí)際上是 “不緩存”)。OPTIONS
?:任何應(yīng)該傳遞給緩存后端的選項(xiàng)。有效的選項(xiàng)列表會(huì)隨著每個(gè)后端而變化,由第三方庫(kù)支持的緩存后端會(huì)直接將其選項(xiàng)傳遞給底層緩存庫(kù)。實(shí)施自有緩存策略的緩存后端(即 ?locmem
?、?filesystem
?和 ?database
?后端)將尊重以下選項(xiàng):
MAX_ENTRIES
?:刪除舊值之前允許緩存的最大條目。默認(rèn)是 300 。CULL_FREQUENCY
?:當(dāng)達(dá)到 ?MAX_ENTRIES
?時(shí),被刪除的條目的比例。實(shí)際比例是 1 / CULL_FREQUENCY,所以將 ?CULL_FREQUENCY
?設(shè)置為 2,即當(dāng)達(dá)到 ?MAX_ENTRIES
?時(shí)將刪除一半的條目。這個(gè)參數(shù)應(yīng)該是一個(gè)整數(shù),默認(rèn)為 3。CULL_FREQUENCY
?的值為 0 意味著當(dāng)達(dá)到 ?MAX_ENTRIES
?時(shí),整個(gè)緩存將被轉(zhuǎn)儲(chǔ)。在某些后端(特別是 ?database
?),這使得緩存速度更快,但代價(jià)是緩存未命中更多。Memcached 和 Redis 后端將 ?OPTIONS
?的內(nèi)容作為關(guān)鍵字參數(shù)傳遞給客戶端構(gòu)造函數(shù),從而允許對(duì)客戶端行為進(jìn)行更高級(jí)的控制。
KEY_PREFIX
?:一個(gè)自動(dòng)包含在 Django 服務(wù)器使用的所有緩存鍵中的字符串(默認(rèn)為前綴)。VERSION
?:Django 服務(wù)器生成的緩存鍵的默認(rèn)版本號(hào)。KEY_FUNCTION
?:一個(gè)字符串,包含一個(gè)函數(shù)的點(diǎn)分隔路徑,該函數(shù)定義了如何將前綴、版本和鍵組成一個(gè)最終的緩存鍵。在本例中,正在配置一個(gè)文件系統(tǒng)后端,超時(shí)為 60 秒,最大容量 1000 項(xiàng):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
'TIMEOUT': 60,
'OPTIONS': {
'MAX_ENTRIES': 1000
}
}
}
下面是一個(gè)基于 ?pylibmc
?的后端配置的例子,它啟用了二進(jìn)制協(xié)議、SASL 認(rèn)證和 ?ketama
?行為模式:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '127.0.0.1:11211',
'OPTIONS': {
'binary': True,
'username': 'user',
'password': 'pass',
'behaviors': {
'ketama': True,
}
}
}
}
下面是一個(gè)基于 ?pymemcache
?的后端配置實(shí)例,它啟用了客戶端池(通過(guò)保持客戶端連接來(lái)提高性能),將 memcache/網(wǎng)絡(luò)錯(cuò)誤視為緩存失效,并在連接的 socket 上設(shè)置了 ?TCP_NODELAY
?標(biāo)志:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
'OPTIONS': {
'no_delay': True,
'ignore_exc': True,
'max_pool_size': 4,
'use_pooling': True,
}
}
}
這是一個(gè)基于 redis 的后端的示例配置,它選擇數(shù)據(jù)庫(kù) 10(默認(rèn)情況下 Redis 附帶 16 個(gè)邏輯數(shù)據(jù)庫(kù)),指定解析器類(如果安裝了?hiredis-py
? 包,則默認(rèn)使用 ?redis.connection.HiredisParser
?),以及 設(shè)置自定義連接池類(默認(rèn)使用?redis.ConnectionPool
?):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379',
'OPTIONS': {
'db': '10',
'parser_class': 'redis.connection.PythonParser',
'pool_class': 'redis.BlockingConnectionPool',
}
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: