django -- 缓存

简介: 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 = ""  # 超时时间

 


相关文章
|
3月前
|
缓存 中间件 数据库
Django入门到放弃之缓存及信号机制
Django入门到放弃之缓存及信号机制
|
3月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
66 0
|
3月前
|
存储 缓存 数据库
Django后端架构开发:信号与缓存架构开发
Django后端架构开发:信号与缓存架构开发
71 0
|
存储 缓存 API
Django缓存的使用方法
Django缓存的使用方法
|
6月前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
57 0
|
6月前
|
缓存 数据库 开发者
Django视图中的缓存机制:提升页面加载速度
【4月更文挑战第15天】本文介绍了Django的缓存机制在提升页面加载速度中的作用。Django提供视图缓存和片段缓存,通过`cache_page`装饰器和`CacheMixin`实现视图级别的缓存,使用`{% cache %}`模板标签实现页面片段缓存。开发者可选择不同的缓存后端,并在设置中配置缓存参数。同时,注意合理控制缓存粒度、及时更新和管理缓存,以优化用户体验和网站性能。
|
缓存 NoSQL 数据库
31 Django高级 - 缓存
31 Django高级 - 缓存
50 0
|
缓存 NoSQL API
Django 缓存6.2
Django 缓存6.2
99 0