django cache 缓存框架
动态网站的基本权衡是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算 - 从数据库查询到模板呈现再到业务逻辑 - 以创建站点访问者看到的页面。从处理开销的角度来看,这比标准的文件读取文件系统服务器安排要昂贵得多
对于大多数Web应用程序来说,这种开销并不是什么大问题,但对于中到高流量的站点,尽可能减少开销是至关重要的。这就需要用到缓存了。
这里有一些伪代码解释了这对于动态生成的Web页面是如何工作的:
#给定一个URL,尝试在缓存中找到该页面
given a URL, try finding that page in the cache
#如果页面在缓存中:
if the page is in the cache:
#返回缓存页面
return the cached page
#否则
else:
#生成页面
generate the page
#将生成的页面保存到缓存中(下次使用)
save the generated page in the cache (for next time)
#返回生成的页面
return the generated page
设置缓存
内存缓存(Memcached)
内存缓存(Memcached):Memcached是Django原生支持的最快,最有效的缓存类型,是一个完全基于内存的缓存服务器,最初是为了处理LiveJournal.com的高负载而开发的,后来由Danga Interactive开源。 Facebook和Wikipedia等网站使用它来减少数据库访问并显着提高网站性能。
Memcached作为守护进程运行,并分配了指定数量的RAM。 它所做的就是提供一个快速接口,用于在缓存中添加,检索和删除数据。 所有数据都直接存储在内存中,因此不会产生数据库或文件系统使用的开销。
安装Memcached本身后,您需要安装Memcached绑定。 有几个Python Memcached绑定可用; 最常见的两个是python-memcached和pylibmc。
在Django中使用Memcached:
1.将BACKEND设置为django.core.cache.backends.memcached.MemcachedCache或 django.core.cache.backends.memcached.PyLibMCCache(取决于您选择的memcached绑定)
2. 将LOCATION设置为ip:port值,其中ip是Memcached守护程序的ip地址,port是Memcached正在运行的端口,或者设置为unix:path值,其中path是Memcached Unix套接字文件的路径
在此示例中,Memcached使用python-memcached绑定在localhost(127.0.0.1)端口11211上运行:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
在此示例中,Memcached可通过本地Unix套接字文件/tmp/memcached.sock使用python-memcached绑定获得:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'unix:/tmp/memcached.sock',
}
}
使用pylibmc绑定时,不要包含unix:/前缀:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '/tmp/memcached.sock',
}
}
Memcached的一个出色功能是它能够在多个服务器上共享缓存。 这意味着您可以在多台计算机上运行Memcached守护程序,程序会将该组计算机视为单个缓存,而无需在每台计算机上复制缓存值。 要利用此功能,请在LOCATION中包括所有服务器地址,可以是分号或逗号分隔的字符串,也可以是列表
在此示例中,缓存通过端口11211上的IP地址172.19.26.240和172.19.26.242上运行的Memcached实例共享:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
在以下示例中,缓存通过在IP地址172.19.26.240(端口11211),172.19.26.242(端口11212)和172.19.26.244(端口11213)上运行的Memcached实例共享:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11212',
'172.19.26.244:11213',
]
}
}
关于Memcached的最后一点是基于内存的缓存有一个缺点:因为缓存的数据存储在内存中,如果服务器崩溃,数据将会丢失。 显然,内存不适用于永久数据存储,因此不要依赖基于内存的缓存作为唯一的数据存储。 毫无疑问,没有任何Django缓存后端应该用于永久存储 - 它们都是用于缓存而不是存储的解决方案 - 但我们在此指出这一点,因为基于内存的缓存特别是暂时的。
数据库缓存
Django可以将其缓存的数据存储在您的数据库中。 如果你有一个快速,索引良好的数据库服务器,这种方法效果最好。
使用数据库表作为缓存后端:
1.将BACKEND设置为django.core.cache.backends.db.DatabaseCache
2.将LOCATION设置为tablename,即数据库表的名称。 此名称可以是您想要的任何名称,只要它是一个尚未在您的数据库中使用的有效表名。
在此示例中,缓存表的名称为my_cache_table:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
创建缓存表
在使用数据库缓存之前,必须使用以下命令创建缓存表:
python manage.py createcachetable
这会在数据库中创建一个表,该表的格式与Django的数据库缓存系统所期望的格式相同。 该表的名称取自LOCATION。
如果您使用多个数据库缓存,createcachetable会为每个缓存创建一个表。
如果您使用多个数据库,createcachetable将遵循数据库路由器的allow_migrate()方法(请参见下文)。
与migrate一样,createcachetable不会触及现有表。它只会创建缺少的表。
要打印将要运行的SQL,而不是运行它,请使用createcachetable - dry-run选项
多个数据库
如果对多个数据库使用数据库缓存,则还需要为数据库缓存表设置路由指令。 出于路由的目的,数据库缓存表在名为django_cache的应用程序中显示为名为CacheEntry的模型。 此模型不会出现在模型缓存中,但模型详细信息可用于路由目的。
例如,以下路由器会将所有缓存读取操作定向到cache_replica,并将所有写入操作定向到cache_primary。 缓存表只会同步到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
如果未指定数据库缓存模型的路由方向,则缓存后端将使用默认数据库。
当然,如果不使用数据库缓存后端,则无需担心为数据库缓存模型提供路由指令
文件系统缓存
基于文件的后端将每个缓存值序列化并存储为单独的文件。 要使用此后端,请将BACKEND设置为“django.core.cache.backends.filebased.FileBasedCache”,并将LOCATION设置为合适的目录。 例如,要将缓存数据存储在/ var / tmp / django_cache中,请使用以下设置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
&