24Django装饰器整体缓存的一种玩法
一,Django设置缓存的三种类型:
#将数据缓存到表里 CACHE={ 'default':{ 'BACKEND':'django.core.cache.backends.db.DatabaseCache',#数据库缓存引擎 'LOCATION':'my_cache_table', #声明缓存存到哪张表! 'TIMEOUT':300,#缓存保存时间单位秒,默认是300秒 'OPTIONS':{ 'MAX_ENTRIES':300,#缓存最大数据条数 'CULL_FREQUENCY':2,#缓存条数达到最大值时,删除1/2的缓存数据 } } }
#数据缓存到内存中 CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.locmem.LocMemCache', 'LOCATION':'/var/tmp/django_cache',#这个时文件夹的路径 'LOCATION':'unique-snowflake' } }
#将缓存数据存储到本地文件中 CACHE = { 'default':{ 'BACKEND':'django.core.cache.backends.filebased.FileBasedCache' } }
二,整体缓存的两种方法:
方式1:
直接配置一个路由,然后把需要缓存的视图函数丢进去,场景举例:突然有人和你说xxx视图变慢了啊,你就可以直接配个路由,然后把视图往里一丢,就完成任务了,比较省心
#整体缓存写法1: from django.views.decorators.cache import cache_page urlpatterns = [ path('foo/', cache_page(30)(my_view)) ]
方式2:
在需要缓存的视图中使用装饰器,例如:
#整体缓存写法2: from django.views.decorators.cache import cache_page @cache_page(30) #单位秒 def my_view(request): ...
三,如何避免程序查询数据缓慢的问题?
答:在内存里放一份临时的数据样本,避免使用复杂的sql语句去查询,如果你能大量的在你的视图中运用缓存,那么一定会大大降低数据处理成本
四,缓存应用场景:
数据变动频率较小的数据,例如博客列表页,电商商品页等,
五示例:
1创建一个项目并用pycharm打开
#找到dajngo-admin的位置: C:\Users\66907\AppData\Roaming\Python\Python310\site-packages\django\bin #添加环境变量 电脑-属性-高级系统设置-环境变量-Path-编辑-新建-粘贴上面的网址 #创建一个项目 C:\Users\66907>d: D:\>cd PycharmProjects D:\PycharmProjects>django-admin.py startproject mysite7
2创建一个数据库:
D:\PycharmProjects>mysql -uroot -p123456
mysql> create database mysite7 default charset utf8;
3在setting.py配置数据库:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite7', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '3306' } }
4在setting中空白位置配置数据库缓存:
#将数据缓存到表里 CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.db.DatabaseCache',#数据库缓存引擎 'LOCATION':'my_cache_table', #声明缓存存到哪张表! 'TIMEOUT':300,#缓存保存时间单位秒,默认是300秒 'OPTIONS':{ 'MAX_ENTRIES':300,#缓存最大数据条数 'CULL_FREQUENCY':2,#缓存条数达到最大值时,删除1/2的缓存数据 } } }
5手动创建缓存配置里面定义的表my_cache_table:
D:\PycharmProjects\mysite7>python manage.py createcachetable
6把django自带的表初始化到数据库
D:\PycharmProjects\mysite7>python manage.py migrate
7在同名mysite7目录下创建一个views.py
mysite7 D:\PycharmProjects\mysite7 mysite7 __init__.py asgi.py settings.py urls.py views.py wsgi.py manage.py
8编写一个视图函数,把时间戳输出到浏览器,如果用户过来走的是缓存,那时间戳应该是一个旧的值,如果不走缓存,那么用户拿到的应该是一个新的值,我们通过观察这个变化即可判断缓存是不是生效了!
from django.http import HttpResponse from django.views.decorators.cache import cache_page import time @cache_page(15) def test_cache(request): t = time.time() return HttpResponse('t is %s'%(t))
9配置路由:
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('test_cache',views.test_cache), ]
10
你可以不停的刷新浏览器,但是浏览器里的时间没有任何变化,直到15秒后才会变化,此时说明缓存生效了