zoukankan      html  css  js  c++  java
  • 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 = ""  # 超时时间
       

  • 相关阅读:
    Flask——session
    UISB ScrollView
    UISB 登陆
    UISB TextField
    UISB 进步器 分栏控制器
    UISB UISlider ProgressView
    UISB Switch
    UISB 定时器
    Django-Celery文档
    UISB UIViewController
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11481208.html
Copyright © 2011-2022 走看看