django缓存(减轻后端服务器的压力)

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 createcachetable

    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
      'LOCATION': 'cache_table',          # 数据库表    
      'OPTIONS':{
       'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }  
     }   
    }
    

缓存粒度

  • 单页缓存

    1. 导入装饰器 from django.views.decorators.cache import cache_page
    2. 视图上加装饰器,参数:缓存过期时间 @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})
    
  • 局部缓存

    1. 页面导入cache标签
    2. 局部包裹到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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值