django -- 缓存

缓存的介绍

我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程:

接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> 模版渲染 -> 返回请求

如果有大量请求来时,都要执行这个操作,那会大大增加服务器的压力,最简单的方法就是设置一个缓存,在一定的时间内,如果访问这个视图函数,则使用缓存数据。

比如我们使用的博客园,有一个分类功能,我们增加一个分类,然后新打开一个窗口,删除那个分类,在原来的窗口刷新查看,新添加的分类还存在,当超过一定的时间之后,在刷新页面,就不存在了,这就是缓存。

什么样的数据适合缓存呢?

不经常更改的数据,并且要设置一个超时时间

缓存放到内存

先在settings.py文件里配置缓存

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 缓存保存到内存里面
        'LOCATION': 'unique-snowflake',
        'TIMEOUT': 600,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)
            'CULL_FREQUENCY': 2,  # 缓存到达最大个数之后,剔除缓存个数的比例,2为删除二分之一(默认3)
        },
    }
}

视图使用缓冲

from django.shortcuts import render
from app01 import models
from django.views.decorators.cache import cache_page


@cache_page(30)  # 使用缓冲,参数为缓冲的有效期,30s
def user_list(request):
    users = models.User.objects.all()
    return render(request, 'user_list.html', {"users": users})

这样就给user_list使用上了缓存,缓存的过期时间为30秒,如果这里不填,则使用配置里的过期时间。

当请求第一次来的时候,访问这个视图函数,30s之内访问,都会去视图里直接拿取超过30s之后才会再次执行视图函数

路由使用缓存

from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r'^user_list', cache_page(60 * 15)(my_view)),
        ]

缓存放到文件

上面我们是把缓存放到内存里,我们也可以放到文件里面,只需要更改配置里的代码即可

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 缓存保存到文件
        'LOCATION': 'F:\cache',  # 缓存的目录路径,给个目录就可以了
        'TIMEOUT': 600,  # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)
            'CULL_FREQUENCY': 2,  # 缓存到达最大个数之后,剔除缓存个数的比例,2为删除二分之一(默认3)
        },
    }
}

使用和上面的使用方法一样

缓存放到数据库

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

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

既然都是在数据库里读取数据,那把缓存放到数据库里和直接读数据库有什么区别呢?把缓存放到数据库里,存的是结果,少了查询和渲染的过程,会比查数据库快

Memcache缓存

# 此缓存使用python-memcached模块连接memcache

    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': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }

缓存的应用

前面说了给某一个视图函数使用缓存,这样的话是比较麻烦的,可以给所有的视图使用缓存

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

MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        # 其他中间件...
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]

CACHE_MIDDLEWARE_SECONDS = ""  # 超时时间
   

猜你喜欢

转载自www.cnblogs.com/zouzou-busy/p/11481208.html