Django 缓存方案

在大型网站上,如果访问的流量很多,又有很多动态的内容,这样每次获取一个信息都要去访问数据库,效率就会比较低下。这种情况下,一般都会使用缓存机制,首先去缓存里面找,如果有信息,那么直接获取;没有的话才去数据库获取,然后在缓存里面生成一个数据可以给下一次访问使用。

Django里面支持5种常见的缓存设置。

  • 开发测试
  • 本地内存
  • 文件
  • 数据库
  • Memcached(或者Redis)

这些配置都是在settings.py里面配置的。

开发测试,如果希望生产环境配置缓存,测试不需要,那么只需设置为dummycache就行了,他不做任何操作

CACHES = {            
 ‘default‘: {                
     ‘BACKEND‘: ‘django.core.cache.backends.dummy.DummyCache‘,     # 引擎
     ‘TIMEOUT‘: 300,                                               # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
     ‘OPTIONS‘:{                    
         ‘MAX_ENTRIES‘: 300,                                       # 最大缓存个数(默认300)
         ‘CULL_FREQUENCY‘: 3,                                      # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)                },                ‘KEY_PREFIX‘: ‘‘,                                             # 缓存key的前缀(默认空)
         ‘VERSION‘: 1,                                             # 缓存key的版本(默认1)
         ‘KEY_FUNCTION‘ 函数名                                      # 生成key的函数(默认函数会生成为:【前缀:版本:key】)            }
        }

本地内存

CACHES = {
    ‘default‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘,
        ‘LOCATION‘: os.path.join(BASE_DIR,‘cache‘)
    }
}

文件

CACHES = {
    ‘default‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘,
        ‘LOCATION‘: os.path.join(BASE_DIR,‘cache‘)
    }
}

数据库

CACHES = {
    ‘default‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.db.DatabaseCache‘,
        ‘LOCATION‘: os.path.join(BASE_DIR,‘cache‘)
    }
}

Memcache 或者Redis,我们甚至可以同时设置多个不同的cache位置

CACHES = {
    "redis": {
        "BACKEND": "redis_cache.cache.RedisCache",
        "LOCATION": "127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    },
    ‘memcache‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
        ‘LOCATION‘: ‘127.0.0.1:11211‘,
        ‘options‘: {
            ‘MAX_ENTRIES‘: 1024,
        }
    },
     ‘default‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.locmem.LocMemCache‘,
        ‘LOCATION‘: ‘unique-snowflake‘,
        ‘options‘: {
            ‘MAX_ENTRIES‘: 1024,
        }
    }}

如何应用呢?

Django 提供了3个级别的应用。

全部缓存

这种方式需要添加两条中间件,注意一上一下的

settings.py

MIDDLEWARE = [
    ‘django.middleware.cache.UpdateCacheMiddleware‘,
    ‘django.middleware.security.SecurityMiddleware‘,
    ‘django.contrib.sessions.middleware.SessionMiddleware‘,
    ‘django.middleware.common.CommonMiddleware‘,
    ‘django.middleware.csrf.CsrfViewMiddleware‘,
    ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
    ‘django.contrib.messages.middleware.MessageMiddleware‘,
    ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
    ‘django.middleware.cache.FetchFromCacheMiddleware‘,
]

CACHES = {
    ‘default‘: {
        ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘,
        ‘LOCATION‘: os.path.join(BASE_DIR,‘cache‘)
    }
}

创建一个文件夹来存放缓存

views.py

def cache(request):
    import time
    ctime = time.time()
    return render(request, ‘cache.html‘, {‘ctime‘: ctime})

cache.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{ ctime }}</h1>
    <h1>{{ ctime }}</h1>
</body>
</html>

这样子整个页面都给缓存了

如果希望更细粒度的缓存,我们可以使用装饰器来装饰对应的视图函数

去掉中间件的设置,然后在我们的视图函数上

from django.views.decorators.cache import cache_page
@cache_page(10)
def cache(request):
    import time
    ctime = time.time()
    return render(request, ‘cache.html‘, {‘ctime‘: ctime})

这样数据缓存10秒之后才会重新刷新

我们还可以再更细粒度的缓存。这次我们在对应的模板文件上针对某个数据进行缓存。

去掉装饰器,然后在cache.html修改

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{ ctime }}</h1>
    <h1>{{ ctime }}</h1>
{##}
     {% cache 5 c1 %}
        <h1>{{ ctime }}</h1>
     {% endcache %}
</body>
</html>

执行操作,上面两个数据是实时更新的,第三个数据缓存5秒之后才更新

时间: 2024-11-04 06:34:28

Django 缓存方案的相关文章

数据缓存方案

数据缓存方案 by 伍雪颖 今天考虑一个适合自己项目的缓存方案,基本都实验了下(以前一直用CoreData) 1.coredata,用MagicalRecord+Mogenerator 要建表,还要写好多解析代码,果断不用,好麻烦 2.序列化 [NSKeyedArchiver archiveRootObject:model toFile:path]; [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 好方便,不过总感觉体验不好,测了下方法时间,当

硬盘缓存方案DiskLruCache源代码解析

前面研究了LruCache,它作为如今用的最多的内存缓存方案已经在非常多开源缓存框架中使用.相同的还有硬盘缓存方案也就是DiskLruCache,通常的做法就是使用内存和硬盘二级缓存. 用法 1.存储: DiskLruCache diskLruCache= open(File directory, int appVersion, int valueCount, long maxSize); DiskLruCache.Editor editor = diskLruCache.edit(key);

硬盘缓存方案DiskLruCache源码解析

前面研究了LruCache,它作为现在用的最多的内存缓存方案已经在很多开源缓存框架中使用,同样的还有硬盘缓存方案也就是DiskLruCache,通常的做法就是使用内存和硬盘二级缓存. 使用方法 1.存储: DiskLruCache diskLruCache= open(File directory, int appVersion, int valueCount, long maxSize); DiskLruCache.Editor editor = diskLruCache.edit(key);

移动应用开发(IOS/android等)中一个通用的图片缓存方案讲解(附流程图)

在移动应用开发中,我们经常会遇到从网络请求图片到设备上展示的场景. 如果每次都重复发起请求,浪费流量.浪费电量,用户体验也不佳: 将图片持久化到磁盘也不失为一种策略:但每次从文件读取图片也存在一定的io开销,就算采用此策略,我们也需要控制磁盘缓存的容量,以免占用过多系统资源. 其实没有一个方案可以说是完美的方案,只有最适合自己业务需求的方案,才可以说是一个好方案. 我们下面所讲解的方案具备很强的通用性,设计思路简单而清晰: 1.假设每个网络图片的url具有唯一性,如果网络上的图片变化了,会引起输

Django—— 缓存框架

译者注:1.无用的,吹嘘的说辞不翻译:2.意译,很多地方不准确. 动态网站最为重要的一点就是好,网页是动态的.每一次用户请求页面,网站就要进行各种计算——从数据库查询,到render模板,到各种逻辑运算——生成页面所需的.这个过程是异常消耗资源的,远远比从硬盘读取一个文件然后显示出来的代价高昂. 对于大多数中小网站来说,这也许不是问题,因为他们的访问量不大,而对于大型网站而言,必须尽量减少不必要的服务器资源开支. 因此,有了缓存技术. 缓存就是把一些需要消耗很多资源的计算结果保存下来,当下次需要

jQuery数据缓存方案详解:$.data()的使用

我们经常使用隐藏控件或者是js全局变量来临时存储数据,全局变量容易导致命名污染,隐藏控件导致经常读写dom浪费性能.jQuery提供了自己的数据缓存方案,能够达到和隐藏控件.全局变量相同的效果,但是jQuery实现方式更优雅.为了更好地使用jQuery数据缓存方案,我们需要掌握$.data().$.cache.$.expando.$.hasData().$.removeData(). $.hasData()用来判断某个对象是否有附加的属性,可以给任何JavaScript对象和HTMLElemen

Django缓存设置

Django缓存分为Session和Cookie:Session为放在服务器端的缓存:Cookie为放在客户端(浏览器)的缓存. Session一般用来保存登录会话:Cookie一般用来保存一些个性化的设置. Session示例: #!/usr/bin/env python #-*- encoding:utf-8 -*- from django.shortcuts import render,redirect # Create your views here. def login(request

白鹭引擎 5.2.7 新增自动合图插件、二进制和声音缓存方案功能

2018年8月13日,白鹭引擎发布5.2.7 版本.本次版本主要新增了两大功能:命令行增加自动合图插件TextureMergerPlugin,微信小游戏支持库增加二进制和声音缓存方案. 同时,本次版本还是对 5.2 版本的一次集中性缺陷修复,更新修复了大家反馈的涉及2D渲染- JavaScript.AssetsManager.微信小游戏支持库的数个BUG.在此,我们要再次特别感谢开发者们通过Egret社区.白鹭引擎小游戏开发微信群等渠道提交的BUG反馈. 5.2.7版本中新增的自动合图插件可以帮

SSD缓存方案之LVM cache

SSD作缓存方案之LVM cache 1. 前言 最近因为工作的需要,接触了一些SSD作缓存相关的知识.所谓SSD作缓存就是使用fast device(例如SSD),给slow device(例如机械硬盘)做缓存,以提高计算机整体的I/O存储性能. 目前在个人计算机中,使用的比较多的是机械硬盘和固态硬盘(SSD).机械硬盘具有容量大,价格便宜,容错性好,寿命较长等优点:缺点是读写性能相对机械硬盘有比较大的差距.固态硬盘的优点是读写性能较好,特别是随机读写性能:缺点是价格比较昂贵,容量小,写入寿命