django框架中的缓存系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django框架中的缓存系统相关的知识,希望对你有一定的参考价值。

一、浏览器的缓存机制

  Cache-Control策略:

    Cache-Control和Expires的作用相似,即指出当前资源的有效期,控制浏览器是直接从浏览器缓存获取数据还是发送Request到服务端获取数据,只不过Cache-Control的选择方式更多,设置详细,如果要同时设置,优先级高于Expires。

技术分享图片

技术分享图片

Cache-Control: max-age=10,即设置缓存存储的最大周期为10s,这和Date与Expires的差值相对应,private表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。

Last-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。

二、Django中的缓存机制:

  1.Django缓存原理

由于django是动态网站,所以当客户端发来请求时均会去对数据库进行相应的操作,当网站访问量大时,必然会更加耗时,最简单的解决方式是使用缓存,缓存将某个视图函数的返回值保存至内存或硬盘中。

django根据设置的缓存方式,浏览器第一次请求时,Cache会缓存响应的数据到硬盘或内存中,同时设置Response,当浏览器再次Request时,附带f-Modified-Since请求时间到django,django发现f-Modified-Since会先去参数后,与缓存中的过期时间比较,如果缓存时间比较新,则会重新请求数据,并缓存数据后返回Response给浏览器,如果缓存没有过期,则直接从缓存中获取数据,Response

给浏览器。

1.1、缓存设置

   (1)设置中间件

1 django.middleware.cache.UpdateCacheMiddleware,  #必须设置在第一个位置 
2  ...其他中间件...
3 django.middleware.cache.FetchFromCacheMiddleware,#必须设置在最后一个位置

    (2)通用设置 

1 CACHE_MIDDLEWARE_ALIAS = default    #缓存别名
2 CACHE_MIDDLEWARE_SECONDS = 0  #页面默认缓存时间,默认600
3 CACHE_MIDDLEWARE_KEY_PREFIX =www.xxx.com  #关键的前缀,当多个站点使用同一个配置的时候,这个可以设置可以避免发生冲突,一般设置为网站域名
4 CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #只有匿名的请求会被缓存,这是一个禁用缓存非匿名用户页面的最简单的做法,注意确保已经启用了Django用户认证中间件

     1.2、Django的缓存方式

      (1)内存缓存

        利用本地内存缓存,这样缓存是多进程和线程安全的。      

1 # 此缓存将内容保存至内存的变量中
2 # 配置:
3 CACHES = {
4        default: {
5        BACKEND: django.core.cache.backends.locmem.LocMemCache,
6        LOCATION: unique-snowflake,
7      }
8 }

        缓存LOCATION用来区分不同的内存存储,如果只有一个本地内存缓存,可以忽略,如果有多

        个时,需要命名区分。

        每个进程都有它们自己的私有缓存实例,所以跨进程缓存是不可能的,因此,本地内存缓存不

        是特别有效率,建议只在内部开发测试时使用,不建议生产环境中使用。

      (2)Memcached

        此缓存使用python-memcached模块连接Memcache,可以支持多个服务器上的Memcached

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: 127.0.0.1:11211,
        }
    }

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: unix:/tmp/memcached.sock,
        }
    }   

    CACHES = {
        default: {
            BACKEND: django.core.cache.backends.memcached.MemcachedCache,
            LOCATION: [
                210.32.26.202:11211,
                210.32.26.203:11211,
            ]
        }
    }

      (3)数据库

        注意:数据库缓存使用的是配置文件中的数据库作为默认数据库,如果想使用其他数据库,需要修改数据库缓存表     

    # 此缓存将内容保存至数据库

    # 配置:
        CACHES = {
            default: {
                BACKEND: django.core.cache.backends.db.DatabaseCache,
                LOCATION: my_cache_table, # 数据库表
            }
        }

    # 注:执行创建表命令 python manage.py createcachetable 表名

      (4)数据库

        注意:数据库缓存使用的是配置文件中的数据库作为默认数据库,如果想使用其他数据库,需要修改数据库缓存表   

  

    # 此缓存将内容保存至文件
    # 配置:

        CACHES = {
            ‘default‘: {
                ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘,
                ‘LOCATION‘: ‘/var/tmp/django_cache‘,
            }
        }

    1.3、缓存应用

      (1)全站应用  

即使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存。      

 

      (2)单独视图应用

    方式一:
        from django.views.decorators.cache import cache_page

        @cache_page(60 * 15)
        def my_view(request):
            ...

    方式二:
        from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r^foo/([0-9]{1,2})/$, cache_page(60 * 15)(my_view)),
        ]

      (3)局部视图应用

    a. 引入TemplateTag

        {% load cache %}

    b. 使用缓存

        {% cache 5000 缓存key %}
            缓存内容
        {% endcache %}

 

 

        

 


以上是关于django框架中的缓存系统的主要内容,如果未能解决你的问题,请参考以下文章

十五 Django框架,缓存

Web框架开发-Django-缓存

Django Cache缓存系统

Django REST框架--认证和权限

Django进阶(中间件缓存)

Celery框架 接口缓存, Celery框架, Django项目实现轮播图缓存更新