Django 中的缓存问题

简单介绍

​ 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.

​ 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.

​ 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.

一、Django 中的缓存方式

  • 开发调试缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

经常使用的有文件缓存和Mencache缓存

二、缓存粒度

  • 全栈缓存
  • 单页面缓存
  • 局部缓存

三、如何使用缓存

3.2.1 开发调试(此模式为开发调试使用,实际上不执行任何操作)

settings.py文件配置

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 缓存后台使用的引擎
  4. 'TIMEOUT': 300, # 缓存超时时间(默认300秒,None表示永不过期,0表示立即过期)
  5. 'OPTIONS':{
  6. 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
  7. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  8. },
  9. }
  10. }

3.2.2 内存缓存(将缓存内容保存至内存区域中)

settings.py文件配置

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎
  4. 'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值
  5. 'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)
  6. 'OPTIONS':{
  7. 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
  8. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  9. }
  10. }
  11. }

3.2.3 文件缓存(把缓存数据存储在文件中)

settings.py文件配置

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

3.2.4 数据库缓存(把缓存数据存储在数据库中)

settings.py文件配置

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

注意,创建缓存的数据库表使用的语句:

  1. python manage.py createcachetable

1.2.5 Memcache缓存(使用python-memcached模块连接memcache)

​ Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc.

settings.py文件配置

  1. CACHES = {
  2. 'default': {
  3. 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
  4. 'LOCATION': '192.168.10.100:11211', # 指定Memcache缓存服务器的IP地址和端口
  5. 'OPTIONS':{
  6. 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
  7. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  8. }
  9. }
  10. }

LOCATION 也可以配置成如下:

  1. 'LOCATION': 'unix:/tmp/memcached.sock', # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
  2. 'LOCATION': [ # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
  3. '192.168.10.100:11211',
  4. '192.168.10.101:11211',
  5. '192.168.10.102:11211',
  6. ]

3.2.6 Memcache缓存(使用pylibmc模块连接memcache)

  1. settings.py文件配置
  2. CACHES = {
  3. 'default': {
  4. 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', # 指定缓存使用的引擎
  5. 'LOCATION':'192.168.10.100:11211', # 指定本机的11211端口为Memcache缓存服务器
  6. 'OPTIONS':{
  7. 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
  8. 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
  9. },
  10. }
  11. }

LOCATION也可以配置成如下:

  1. 'LOCATION': '/tmp/memcached.sock', # 指定某个路径为缓存目录
  2. 'LOCATION': [ # 分布式缓存,在多台服务器上运行Memcached进程,程序会把多台服务器当作一个单独的缓存,而不会在每台服务器上复制缓存值
  3. '192.168.10.100:11211',
  4. '192.168.10.101:11211',
  5. '192.168.10.102:11211',
  6. ]

Memcached是基于内存的缓存,数据存储在内存中.所以如果服务器死机的话,数据就会丢失,所以Memcached一般与其他缓存配合使用

四、Django中缓存的应用

Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站.

数据库

  1. class Book(models.Model):
  2. name=models.CharField(max_length=32)
  3. price=models.DecimalField(max_digits=6,decimal_places=1)

视图函数

  1. from django.views.decorators.cache import cache_page
  2. import time
  3. from .models import *
  4. @cache_page(15) #超时时间为15秒
  5. def index(request):
  6.   t=time.time() #获取当前时间
  7.   bookList=Book.objects.all()
  8.   return render(request,"index.html",locals())

模板

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h3>当前时间:-----{{ t }}</h3>
  9. <ul>
  10. {% for book in bookList %}
  11. <li>{{ book.name }}--------->{{ book.price }}$</li>
  12. {% endfor %}
  13. </ul>
  14. </body>
  15. </html>

上面的例子是基于内存的缓存配置,基于文件的缓存该怎么配置呢??

更改settings.py的配置

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

然后再次刷新浏览器,可以看到在刚才配置的目录下生成的缓存文件

通过实验可以知道,Django会以自己的形式把缓存文件保存在配置文件中指定的目录中.

全站使用缓存

​ 既然是全站缓存,当然要使用Django中的中间件.

​ 用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户

​ 当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存

  1. # 缓存整个站点,是最简单的缓存方法
  2. # 在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件
  3. MIDDLEWARE_CLASSES = (
  4. django.middleware.cache.UpdateCacheMiddleware’, #第一
  5. 'django.middleware.common.CommonMiddleware',
  6. django.middleware.cache.FetchFromCacheMiddleware’, #最后
  7. )
  8. # “update” 必须配置在第一个
  9. # “fetch” 必须配置在最后一个

修改settings 中的配置

  1. MIDDLEWARE_CLASSES = (
  2. 'django.middleware.cache.UpdateCacheMiddleware', #响应HttpResponse中设置几个headers
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  8. 'django.contrib.messages.middleware.MessageMiddleware',
  9. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  10. 'django.middleware.security.SecurityMiddleware',
  11. 'django.middleware.cache.FetchFromCacheMiddleware', #用来缓存通过GET和HEAD方法获取的状态码为200的响应
  12. )
  13. CACHE_MIDDLEWARE_SECONDS=10
视图函数:
  1. from django.views.decorators.cache import cache_page
  2. import time
  3. from .models import *
  4. def index(request):
  5. t=time.time() #获取当前时间
  6. bookList=Book.objects.all()
  7. return render(request,"index.html",locals())
  8. def foo(request):
  9. t=time.time() #获取当前时间
  10. return HttpResponse("HELLO:"+str(t))

模板(index.html):

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h3 style="color: green">当前时间:-----{{ t }}</h3>
  9. <ul>
  10. {% for book in bookList %}
  11. <li>{{ book.name }}--------->{{ book.price }}$</li>
  12. {% endfor %}
  13. </ul>
  14. </body>
  15. </html>

4.3局部视图缓存

例子,刷新页面时,整个网页有一部分实现缓存

views视图函数

  1. from django.views.decorators.cache import cache_page
  2. import time
  3. from .models import *
  4. def index(request):
  5. t=time.time() #获取当前时间
  6. bookList=Book.objects.all()
  7. return render(request,"index.html",locals())

模板(index.html):

  1. {% load cache %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. <h3 style="color: green">不缓存:-----{{ t }}</h3>
  10. {% cache 2 'name' %}
  11. <h3>缓存:-----:{{ t }}</h3>
  12. {% endcache %}
  13. </body>
  14. </html>

四、如何提高网站的并发量

QPS:

  • 前端处理--(主要是减少请求次数)

    • 使用 CDN (静态文件放在别人的服务器上面去)

      • CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
      • 图片防盗链--前端的 请求头 refer 信息(显示前一个网站)
        • 可以挺过refer 控制
        • Nginx 处理
    • 精灵图(拼图,多次请求变成一次请求)
    • 页面本地缓存
  • 后端:
    • nginx 挡在WSGI之前-nginx 的负载均衡 后台服务做集群部署

      • 反向代理
      • 正向代理
    • 进入到中间件过后 -----后台缓存 在 process_request 里面写
      • ---设置缓存的超时时间,保持缓存数据更新一致性的问题
    • 数据库的主从同步
    • 数据库的读写分离(用的比较多)
    • 异步处理(celery:分布式的异步任务框架)
    • 用性能高的语言去处理并发高的语言

TPS

反向代理

  • 在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关联的一组或多组后端服务器上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在[1]。

    与前向代理不同,前向代理作为客户端的代理,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如Web服务器)只知道代理的IP地址而不知道客户端的IP地址;而反向代理是作为服务器端(如Web服务器)的代理使用,而不是客户端。客户端借由前向代理可以间接访问很多不同互联网服务器(簇)的资源,而反向代理是供很多客户端都通过它间接访问不同后端服务器上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。

正向代理

  • 正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

集群和分布式

负载均衡

  • 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
  • 负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

轮询:

  • 轮询(Polling)是一种CPU决策如何提供周边设备服务的方式,又称“程控输入输出”(Programmed I/O)。轮询法的概念是:由CPU定时发出询问,依序询问每一个周边设备是否需要其服务,有即给予服务,服务结束后再问下一个周边,接着不断周而复始。

Django 中的缓存问题的更多相关文章

  1. Django中的缓存(内存,文件,redis)

    一.Django中的缓存的几种方法 1)单个视图缓存.时间测试 import time from django.views.decorators.cache import cache_page @ca ...

  2. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  3. django中的缓存以及跨域

    django中的缓存 先来了解以下问题

  4. Django中的缓存基础知识

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  5. django中的缓存

    对于一个动态网站来说,用户的每次访问都意味着对服务器的一次开销,当该服务器的并发访问非常大时,对于一个动态网站来说,开销会非常的大.所以对于大中型web应用来说,减轻服务器的性能瓶颈就很有必要 对于d ...

  6. Django中使用缓存

    settings中的配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache ...

  7. django中的缓存 跨域问题(同源策略)

    django缓存机制 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作 ...

  8. Django中的缓存机制

    概述       对于中等流量网站来说,尽可能的减少开销是必要的.缓存数据就是为了保存那些需要很多计算资源大的结果,这样的的话就不必在下次重复消耗计算资源.     Django自带了一个健壮的缓存系 ...

  9. Django实现内容缓存

    1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...

随机推荐

  1. VNC远程登陆树莓派3(包括开机启动)

    在树莓派上安装VNC需要使用命令行.如果需要远程操作安装VNC,就必须通过SSH登录到命令行界面(Raspbian的默认用户名是:pi,默认密码是:raspberry). 安装 命令行输入: sudo ...

  2. 误删除/boot ,如何修复

    进入救援模式 1.chroot /mnt/sysimage  将路径修改为 /mnt/sysimage 2.mkdir /mnt/temp mount /dev/sr0 /mnt/temp 挂载光盘 ...

  3. Spring Boot 知识笔记(整合Redis)

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. springcloud2.x之management.security.enabled=false报错处理

    1. springcloud1.5.x的消息总线配置是 # RabbitMq的地址.端口,用户名.密码 spring.rabbitmq.host=localhost spring.rabbitmq.p ...

  5. @PostConstruct、@Autowired以及构造函数的执行顺序

    结论先行:构造函数 -> PostConstruct -> @Autowired 依次执行 由于项目需要启动时加载一个配置信息,所以想到了用@PostConstruct,如下所示: @Co ...

  6. Laravel关联模型中has和with区别

    本篇文章给大家带来的内容是关于Laravel关联模型中has和with区别(详细介绍),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 首先看代码: 1 2 3 4 5 6 $user ...

  7. kubeadm安装kubernetes 1.16.2

    目录 简介 环境说明 安装 准备基础环境 安装docker 安装kubeadm.kubelet.kubectl 配置kubeadm-config.yaml 部署master 安装flannel网络插件 ...

  8. fastclick作用

    fastclick 是具有消除移动端浏览器上的点击事件的 300ms 的延迟的作用. 注意几点 1.PC端无效 2.Android 上的 Chrome 32+ 浏览器,如果在 viewport met ...

  9. 全链路追踪技术选型:pinpoint vs skywalking

    目前分布式链路追踪系统基本都是根据谷歌的<Dapper大规模分布式系统的跟踪系统>这篇论文发展而来,主流的有zipkin,pinpoint,skywalking,cat,jaeger等. ...

  10. day06——小数据池、深浅拷贝、集合

    day06 小数据池 小数据池--缓存机制(驻留机制),只是一种规格,不会实际的开辟一个空间 == 判断两边内容是否相等 ***** # a = 10 # b = 10 # print(a == b) ...