Django-缓存

Django缓存

Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。

缓存系统工作原理:

对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容。

缓存的作用

- 提升服务器响应速度
- 将执行过的操作数据存储下来,在一定的时间内,再次获取数据的时候,直接从缓存中获取
- 比较理想的方案,缓存使用内存级缓存
- Django内置缓存框架

缓存框架的核心目标:

  • 较少的代码

    • 缓存应该仅可能快

    • 因此围绕缓存后端的所有代码应该保存在绝对最小值,特别是对于获取操作

  • 一致性

    • 缓存Api应该是提供跨域不同缓存后端的一致接口

  • 可扩展性

    • 基于开发人员的需求,缓存api应该可以在应用程序级别进行扩展

Django内置的缓存:

1、开发调试缓存
2、内存缓存
3、文件缓存
4、数据库缓存
5、缓存到redis

Django settings 中 cache 默认为

{
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

也就是默认利用本地的内存来当缓存,速度很快。当然可能出来内存不够用的情况,其它的一些内建可用的 Backends 有利用文件系统来缓存:

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)
  }  
 }
}

利用数据库来缓存,利用命令创建相应的缓存表:

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

缓存的力度:

  • 全站缓存 来的请求所需要的所有数据全部缓存

  • 单页面缓存 单独一个页面所需的数据缓存起来

  • 局部缓存 页面中某个位置的数据缓存起来

下面用一些实例来说明如何使用 Django 缓存系统

一般来说我们用 Django 来搭建一个网站,要用到数据库等。

from django.shortcuts import render
def index(request):
    # 读取数据库等 并渲染到网页
    # 数据库获取的结果保存到 queryset 中
    return render(request, 'index.html', {'queryset':queryset})
 

像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题.

1.1、单页面的缓存:在视图函数上加上一个装饰器即可

from django.views.decorators.cache import cache_page
import time
@cache_page(10)   # 设置超时时间
def test(request):
    ctime = time.time()
    return render(request,'test.html',locals())
​

需要注意,在settings里配置一下:


CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 指定缓存使用的引擎
        'LOCATION': 'C:\cache_location',  # 指定缓存的路径
        'TIMEOUT': 300,  # 缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}
 

1.2 cbv下实现单页面缓存

from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
import time
@method_decorator(cache_page(5),name='dispatch')
class ShowTime(APIView):
    def get(self,request):
        ctime = time.strftime('%Y-%m-%d %H:%M:%S')
        return render(request,'show_time.html',{'ctime':ctime})
 

2、局部缓存

from django.core.cache import cache
import time
def test(request):
    ctime = time.time()
    return render(request,'test.html',{'time':ctime})
 

虽然与单页面的settings配置是一样的,但在模板文件里存在一定的差异性。

templates:

{% load cache %}
                  {{ time }}   #这部分的内容没有被缓存
                {% cache 5 'test'%}    #第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,需要根据key值取)
                    当前时间:{{ time }}    # 这部分的数据被缓存
                {% endcache %} 
 

3、全站缓存

需要在settings里配置两个中间件,一个在最上方,一个在最下方

同时还需要配置超时时间,同样在settings里配置
CACHE_MIDDLEWARE_SECONDS = 5     超时时间设定为5秒
需要注意:不需要配置CACHES了!

缓存的高级用法:
  对于前后端分离的项目:
cache.set('test_data',{'name':'michael','age':18},5) 
#对应的key为 test_data,数据位字典里的数据,超时时间为5秒
cache.get('test_data')   # 取对应的缓存数据
 

当使用了cache后,访问情况变成了如下:

访问一个网址时, 尝试从 cache 中找有没有缓存内容
如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。
给定一个URL,尝试在缓存中找到该页面
if 页面在缓存中:
  返回缓存的页面
else:
  生成页面
  将生成的页面保存在缓存中(以备下次使用)
  返回生成的页面

Memcached 是目前 Django 可用的最快的缓存,另外,Django 还可以共享缓存,一般我们只会使用Memcached 缓存或者数据库redis缓存。

posted @ 2020-12-14 09:58  IT小码农!!!!  阅读(35)  评论(0)    收藏  举报