Django缓存清理和缓存设置
缓存清理
方法很多,提供两个思路
1、直接去清理用来存缓存的介质,如memcached、redis()
2、自己写程序脚本清空。
3、使用django-extensions来清空缓存
2、自己写程序脚本清空
步骤:
1、给manage.py添加自定义命令,用来执行写好的脚本。
如
python manage.py cleancache #清空缓存
+
+obj
±-obj
±-app01
–management
–commandes
– cleancache .py
–
如上目录在app下新建management目录,management下在建立commandes目录用来存cleancache .py脚本
脚本内容
from django.core.management.base import BaseCommand, CommandError
from django.core.cache import caches
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
‘-n’,
‘–name’,
action=‘store’,
dest=‘name’,
default=‘default’,
help=‘clean django cache’,
)
def handle(self, *args, **options):
try:
if options[‘name’]:
cache = caches[options[‘name’]]
cache.clear()
self.stdout.write(self.style.SUCCESS(‘缓存清理成功’)
except Exception, ex:
self.stdout.write(self.style.ERROR(‘命令执行出错’))
使用命令
python manage.py clean_cache defualt, 就能清空memcacahe中default的缓存。defualt为setting.py设置的缓存中间件别名
Setting.py
REDIS_TIMEOUT=246060
CUBES_REDIS_TIMEOUT=6030
NEVER_REDIS_TIMEOUT=365246060
CACHES= {‘default’: {
‘BACKEND’: ‘django_redis.cache.RedisCache’,
‘LOCATION’: ‘redis://localhost:6379’, # redis “OPTIONS”: {
“CLIENT_CLASS”: “t”,
“CONNECTION_POOL_KWARGS”: {
“max_connections”: 10000
}
#“PASSWORD”: “”,
},
},
}
CACHE_MIDDLEWARE_ALIAS = ‘default’
CACHE_MIDDLEWARE_SECONDS = 606060
CACHE_MIDDLEWARE_KEY_PREFIX = “cache_redis_demo_first_xxxxXfStyle”
3、使用django-extensions来清空缓存(这个开箱即用)
A、安装 pip install django-extensions
B、配置
INSTALLED_APPS = (
…
‘django_extensions’,
…
)
C、使用命令:
python manage.py clear_cache --cache defualt # 清理特定缓存
python manage.py clear_cache --all # 清空全部缓存
django-extensions命令扩展:
shell_plus: 加强版的Django shell,每次进入为你自动载入项目中所有的model,可以让你很方便的开始调试
admin_generator: 只要你提供app label,就会自动为你输出定义的Admin Class代码,默认输出在stdout
clean_pyc: 移除项目中所有的pyc文件
create_command: 为一个app生成自定义命令所需要的目录结构。
create_template_tags: 为一个app生成template tag所需要的目录结构。
clear_cache: 清除缓存,在测试和开发环境很有用
compile_pyc: 为项目编译python字节码
describe_form: 生产一个model的form代码,你可以将它拷贝到你的文件
delete_squashed_migrations: 删除残留的squash migration文件
dumpscript: 生产一个python 脚本,用来重新填充数据库
export_emails: 为你的用户生成email地址
graph_model: 创建基于model的GraphViz2文件.
mail_debug: 开启一个邮件服务器,它会打印邮件内容而不是把它发送出去
merge_model_instances: 合并重复的model instance
notes: 展示代码中所有的 TODO, FIXME, BUG, HACK, WARNING, NOTE, XXX 的地方
passwd: 轻松修改用户密码
pipchecker: 检查pip是否有过期的packages,类似于pip * list -o,只用于已安装的packages
print_settings: 展示所有的,或者指定的django settings
print_user_for_session: 通过session来找到user,并且打印
drop_test_database: 删除测试数据库
reset_db: 使用DROP DATABASE和CREATE DATABASE来重置数据库
runprofileserver: 开启一个激活了profile功能的开发服务器
runscript: 在django上下文中运行一个脚本
runserver_plus: 标准的runserver加上Werkzeug的debugger工具
set_fake_emails: 根据用户的数据,为所有用户设置一个虚构的email
show_template_tags: 展示当前项目可用的template tags和template filters
show_urls: 展示当前项目所有定义的urls
sqldiff: 展示model和数据库是否结构不一样,如果有不一样的地方就展示出来
sqlcreate: 根据你的settings.py定义,为你生成创建数据库的SQL代码
sqldsn: 根据settings.py定义的数据库配置,返回一个可以用于其它程序的数据库URI
sync_s3: 将MEDIA_ROOT的文件复制到S3
update_permissions: 重载权限
validate_templates: 确认template是否有语法错误
设置缓存
动态网站每一次请求都是动态的,服务器都会进行各种计算,但是对于一些更新频次不是太高的信息可以用缓存技术来节省服务开销。
每次用户请求页面时,Web 服务器都会进行各种计算——从数据库查询到模板呈现再到业务逻辑——以创建站点访问者看到的页面。
设置缓存
使用缓存需要设置一些东西,如缓存地方,缓存神魔?
第一步修改setting.py
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.memcached.PyMemcacheCache’, #基于内存的缓存
‘LOCATION’: ‘127.0.0.1:11211’,
}
}
设置缓存地址?
- 内存缓存
Memcached是Django 本地支持的最快、最有效的缓存类型,它 是一个完全基于内存的缓存服务器,最初开发用于处理 LiveJournal.com 的高负载,随后由 Danga Interactive 开源。Facebook 和维基百科等网站使用它来减少数据库访问并显着提高网站性能。
Memcached 作为守护进程运行,并被分配指定数量的 RAM。它所做的只是提供一个快速接口,用于在缓存中添加、检索和删除数据。所有数据都直接存储在内存中,因此没有数据库或文件系统使用的开销。
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.memcached.PyMemcacheCache’, #基于内存的缓存
‘LOCATION’: ‘127.0.0.1:11211’,
}
}
Memcached 的一项出色功能是能够在多个服务器上共享缓存。这意味着您可以在多台机器上运行 Memcached 守护进程,并且程序会将这组机器视为单个 缓存,而无需在每台机器上复制缓存值。要利用此功能,请将所有服务器地址包含在 中 LOCATION,以分号或逗号分隔的字符串或列表形式。
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.memcached.PyMemcacheCache’,
‘LOCATION’: [
‘172.19.26.240:11211’,
‘172.19.26.242:11211’,
]
}
}
- 数据库缓存¶
Django 可以将其缓存数据存储在您的数据库中。如果您有一个快速、索引良好的数据库服务器,这将最有效。
使用数据库表作为缓存后端:
• 设置BACKEND为 django.core.cache.backends.db.DatabaseCache
• 设置LOCATION为tablename,数据库表的名称。该名称可以是您想要的任何名称,只要它是尚未在您的数据库中使用的有效表名即可。
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.db.DatabaseCache’,
‘LOCATION’: ‘my_cache_table’,
}
}
这种方法在使用数据库缓存之前,您必须使用以下命令创建缓存表:
python manage.py createcachetable
- 文件系统缓存¶
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.filebased.FileBasedCache’,
‘LOCATION’: ‘/var/tmp/django_cache’,
}
}
- 本地内存缓存¶
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.locmem.LocMemCache’,
‘LOCATION’: ‘unique-snowflake’,
}
}
缓存参数¶
可以为每个缓存后端提供额外的参数来控制缓存行为。这些参数在设置中作为附加键提供 CACHES。有效参数如下:
• TIMEOUT:用于缓存的默认超时(以秒为单位)。此参数默认为300秒(5 分钟)。您可以设置TIMEOUT为None,默认情况下,缓存键永不过期。值0导致键立即过期(有效地“不缓存”)。
• OPTIONS:应该传递给缓存后端的任何选项。每个后端的有效选项列表都会有所不同,第三方库支持的缓存后端会将它们的选项直接传递给底层缓存库。
实现自己的剔除策略的缓存后端(即locmem,filesystem和database后端)将遵循以下选项:
• MAX_ENTRIES:删除旧值之前缓存中允许的最大条目数。此参数默认为300。
• CULL_FREQUENCY:MAX_ENTRIES达到时被剔除的条目的分数。实际比率为 ,因此设置为在达到时剔除一半的条目。这个参数应该是一个整数,默认为。1 / CULL_FREQUENCYCULL_FREQUENCY2MAX_ENTRIES3
0for的值CULL_FREQUENCY意味着当MAX_ENTRIES达到时将转储整个缓存。在一些后端(database尤其是)这使得扑杀多 以更高速缓存未命中的代价更快。
Memcached 后端将内容OPTIONS 作为关键字参数传递给客户端构造函数,允许对客户端行为进行更高级的控制。例如用法,见下文。
• KEY_PREFIX:将自动包含(默认情况下)到 Django 服务器使用的所有缓存键的字符串。
VERSION: Django 服务器生成的缓存键的默认版本号。
• KEY_FUNCTION 一个字符串,它包含一个函数的虚线路径,该函数定义了如何将前缀、版本和键组合成最终的缓存键。
在此示例中,文件系统后端配置的超时时间为 60 秒,最大容量为 1000 个项目:
CACHES = {
‘default’: {
‘BACKEND’: ‘django.core.cache.backends.filebased.FileBasedCache’,
‘LOCATION’: ‘/var/tmp/django_cache’,
‘TIMEOUT’: 60,
‘OPTIONS’: {
‘MAX_ENTRIES’: 1000
}
}
}
缓存神魔?
- 缓存整个站点
MIDDLEWARE = [
‘django.middleware.cache.UpdateCacheMiddleware’,
‘django.middleware.common.CommonMiddleware’,
‘django.middleware.cache.FetchFromCacheMiddleware’,
]
对具有不同查询参数的同一 URL 的请求的响应被认为是唯一的页面并单独缓存。这个中间件期望 HEAD 请求得到与相应 GET 请求相同的响应头;在这种情况下,它可以为 HEAD 请求返回缓存的 GET 响应。
“update”中间件必须在列表中的第一个,“fetch”中间件必须在最后。
然后,将以下必需的设置添加到您的 Django 设置文件中:
• CACHE_MIDDLEWARE_ALIAS – 用于存储的缓存别名。
• CACHE_MIDDLEWARE_SECONDS – 每个页面应该被缓存的秒数。
• CACHE_MIDDLEWARE_KEY_PREFIX– 如果缓存在使用相同 Django 安装的多个站点之间共享,请将其设置为站点名称,或此 Django 实例独有的其他一些字符串,以防止密钥冲突。如果您不在乎,请使用空字符串。
此外,UpdateCacheMiddleware自动在每个标题中设置一些HttpResponse影响下游缓存的标题:
• 将Expires标题设置为当前日期/时间加上定义的 CACHE_MIDDLEWARE_SECONDS.
• 设置Cache-Control标题以提供页面的最大年龄 - 同样,来自CACHE_MIDDLEWARE_SECONDS设置。
- • 缓存视图
django.views.decorators.cache定义了一个cache_page 装饰器,
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) #缓存时间
def my_view(request):
…
• cache_page还可以采用可选的关键字参数 ,cache它指示装饰器CACHES在缓存视图结果时使用特定的缓存 设置)。
• @cache_page(60 * 15, cache=“special_cache”)
def my_view(request):
…
- • 在 URL 缓存¶
from django.views.decorators.cache import cache_page
urlpatterns = [
path(‘foo/int:code/’, cache_page(60 * 15)(my_view)),
]
- 模板片段缓存
{% load cache %}
{% cache 500 sidebar %}
… sidebar …
{% endcache %}
- 也可自定义缓存对象
from django.core.cache import cache
cache.set(‘my_key’, ‘hello, world!’, 30)
cache.add(‘add_key’, ‘New value’)
cache.get(‘my_key’)