django缓存(减轻后端服务器的压力)
缓存位置
修改配置文件中的:
1.缓存引擎
2.缓存地址
文件缓存示例:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎
'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值
'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX*ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL*FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
-
开发调试
此模式为开发调试使用,实际上不执行任何操作 ‘BACKEND’: 'django.core.cache.backends.dum 台使用的引擎
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 缓存后台使用的引擎 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, } }
-
内存缓存
‘BACKEND’: ‘django.core.cache.backends.locmem.LocMemCache’, 的引擎 TION’: ‘unique-snowflake’,
#写在内存中的变量的唯一值CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎 'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值 'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
-
文件缓存
‘BACKEND’: ‘django.core.cache.backends.filebased.FileBasedCache’,
#指定 缓存使用的引擎 ‘LOCATION’: ‘/var/tmp/django_cache’,
#指定缓存的路径CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎 'LOCATION': '/var/tmp/django_cache', #指定缓存的路径 'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
另外:
可以看到文件缓存的路径下有两个.djcache
后缀的缓存文件,删除这两个文件缓存也就没有了
每次请求来了,都先从文件中找有没有缓存文件(不可打开查看,底层是以pickle格式bytes存储),有就直接返回这个文件,没有才继续走视图逻辑 -
数据库缓存
‘BACKEND’: ‘django.core.cache.backends.db.DatabaseCache’,
#指定缓存使 用的引擎 ‘LOCATION’: ‘cache_table’,
#数据库表 迁移: python manage.py createcachetableCACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎 'LOCATION': 'cache_table', # 数据库表 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
缓存粒度
-
单页缓存
- 导入装饰器 from django.views.decorators.cache import cache_page
- 视图上加装饰器,参数:缓存过期时间 @cache_page(10)
from django.shortcuts import render from django.views.decorators.cache import cache_page @cache_page(10) # 缓存过期时间 def index(request): import time ctime = time.time() return render(request, 'index.html', context={"ctime": ctime})
-
局部缓存
- 页面导入cache标签
- 局部包裹到cache的block中 参数:过期时间,局部缓存名称
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>缓存测试</title> </head> <body> 没有缓存的 当前时间为:{{ ctime }} <hr> {% load cache %} {% cache 5 'part1' %} <!-- cache要两个参数:缓存失效时间 '局部缓存命名' --> 有缓存的 当前时间为:{{ ctime }} {% endcache %} </body> </html>
-
整站缓存(两个中间件)
在setting中配置 ‘django.middleware.cache.UpdateCacheMiddleware’, ‘。。。’, ‘django.middleware.cache.FetchFromCacheMiddleware’, # 缓存过期时间 CACHE_MIDDLEWARE_SECONDS=5
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 第一,重写了process_response 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', # 最后,重写了process_requset ] CACHE_MIDDLEWARE_SECONDS = 5
前后端分离使用
1-导入 from django.core.cache import cache
2-cbv视图逻辑:判断是否有缓存
-有就 cache.get(‘缓存名’),return这个结果
-没有
先查出要缓存的结果
再设置缓存 cache.set(‘cache_book_list’, ser.data, 5) # 参数:缓存名 要缓 存的数据 缓存失效时间
return 查出的结果
from rest_framework.views import APIView
from app01 import models, serializer
from django.core.cache import cache
from rest_framework.response import Response
class BookAPIView(APIView):
def get(self, request):
cache_data = cache.get('cache_book_list')
if cache_data: # 有缓存,直接返回
print('走了缓存')
return Response(cache_data)
else: # 没有缓存,再走数据库
book_list = models.Book.objects.all()
ser = serializer.BookSerializer(instance=book_list, many=True)
print(ser.data)
cache.set('cache_book_list', ser.data, 5) # 想把ser.data缓存起来
print('没走缓存')
return Response(ser.data)