Django 配置缓存机制

**Django ** 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。而使用缓存的话,可以将数据保存在缓存中,下次访问的时候直接从缓存中获得数据,而不用去请求后端数据库,这样服务器可以很快的响应请求,从而提高加载速度。

缓存系统工作原理

对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容。

一般来说我们用 Django 来搭建一个网站,要用到数据库等。

from django.shortcuts import render
def index(request):
# 读取数据库等 并渲染到网页
# 数据库获取的结果保存到 queryset 中
return render(request, 'index.html', {'book_list':book_list})

像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。

当使用了cache后,访问情况就变化了。

from django.shortcuts import render
from django.views.decorators.cache import cache_page @cache_page(60 * 15) # 秒数,这里指缓存 15 分钟,不直接写900是为了提高可读性
def index(request):
# 读取数据库等 并渲染到网页
return render(request, 'index.html', {'book_list':book_list}) # 访问一个网址时, 尝试从 cache 中找有没有缓存内容
# 如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。

Django settings 中 默认cache

也就是默认利用本地的内存来当缓存,速度很快。

当然可能出来内存不够用的情况

from  django.conf import settings
print(settings.CACHES)
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}} {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}

下面我们就来介绍一下各种缓存的配置:

缓存配置

利用文件系统来缓存

这个很简单,就是将数据缓存在指定的目录中。配置如下:

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache', # linux 中的目录,前提目录必须存在
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 1000
}
}
}

使用Memcache来缓存:

Memcached 是目前 Django 可用的最快的缓存,

但是memcache需要你的服务器支持,也就是说需要有Memcache服务,

Linux系统安装Memcached,首先要先安装libevent库。

$ yum -y install libevent ibevent-devel         联网自动下载安装

$ yum -y install install memcached		linux安装memcached 的方法我就不说了,自己去找去

然后需要pip3安装Memcached的插件Python-mencached 和 pylibmc

$ pip3 install Python-mencached
$ pip3 install pylibmc

最后在setting.py配置:

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}

使用Local-memory来缓存:

这种缓存方式会将数据保存在服务器的内存中。

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}

最推荐的缓存方式是Memcache或者Local-memory,要不就是文件缓存

Django使用Redis作为缓存

redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,

安装该数据库是为了做服务器缓存。以下两种情况都适合使用服务器缓存:

1)数据非经常更新。若每次都从硬盘读取一次,浪费服务器资源、拖慢响应速度。

2)数据更新频率较高,服务器负担比较大。

这些数据只需每天更新一次。而我每次都从数据库获取相应的数据,计算统计排行情况和阅读数。很明显浪费服务器资源,浪费时间。解决方法是定时统计一次数据,保存到数据库或文件中。每次读取数据从中获取。

若保存到数据库,还需要额外建立一张对应的表存储数据。在Django中建立表通常做法是建立一个模型。看似简单,问题调试麻烦、开发时长久。所以我一直拖着没处理该问题。毕竟一开始访问量不是很多。后来不少网友访客打开慢(当然服务器在国外也是个原因),查了资料发现Redis内存数据库。可以将数据写入到内存,再进行读写。减少计算量,可以有效提高服务器响应速度。

这么一来,我就不用创建新表创建模型。直接将数据写入缓存,定时更新。获取数据从服务器缓存获取即可。

下面我就来介绍如何在Django中配置使用redis数据库!

安装django-redis

pip3 install django-redis

settings配置

# redis 缓存数据库配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.32.130:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES":True,
"PASSWORD": "root",
}
}
}

views视图中使用redis

# 视图中使用redis缓存数据库
from django_redis import get_redis_connection
conn = get_redis_connection('default')

全站缓存

在django中的settings配置文件中设置

'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',

单视图缓存

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def cache(request):
# return HttpResponse('hello') # 当我们第一次访问的时候,redis中已经存在了一个hello的值,当我们发送的数据发生改变的时候,这时候因为过期时间还没到,不会清除缓存的信息。
return HttpResponse('hellodsafnjsakfaskfg')

在页面中局部进行缓存

  • 使用cache模板标签来缓存模板的一个片段
  • 需要两个参数:
    • 缓存时间,以秒为单位
    • 给缓存片段起的名称
步骤I. 引入TemplateTag
{% load cache %}
步骤II. 使用缓存
{% cache 5000 缓存key %} 缓存时间 5000秒
缓存内容
{% endcache %}

底层的缓存API

from django.core.cache import cache

设置:cache.set(键,值,有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear()

Django缓存机制以及使用redis缓存数据库的更多相关文章

  1. 使用本地缓存快还是使用redis缓存好?

    使用本地缓存快还是使用redis缓存好? Redis早已家喻户晓,其性能自不必多说. 但是总有些时候,我们想把性能再提升一点,想着redis是个远程服务,性能也许不够,于是想用本地缓存试试!想法是不错 ...

  2. Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析

    Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...

  3. 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图

    1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...

  4. 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

    一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...

  5. 缓存机制 ehcache、redis

    本文主要记录ehcache和redis实现缓存(redis版本号:5.0.3) 一.ehcache 1.ehcache:用来管理Java中缓存的轻量级工具,其核心通过CacheManager使用,一般 ...

  6. 【Redis缓存机制】1.Redis介绍和使用场景

    (1)持久化数据库的缺点平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常使 ...

  7. 全面剖析Smarty缓存机制一[三种缓存方式]

    今天主要全面总结下Smarty模板引擎中强大的缓存机制,缓存机制有效减少了系统对服务器的压力,而这也是很多开发者喜欢Smarty的原因之一,由于篇幅较大,便于博友阅读,这篇文章将剖析Smarty缓存的 ...

  8. 详解浏览器缓存机制与Apache设置缓存

    一.详解浏览器缓存机制 对于,如何说明缓存机制,在网络上找到了两张图,个人认为思路是比较清晰的.总结时,上图. 这里需要注意的有两点: 1.Last-Modified.Etag是响应头里的数据 2.I ...

  9. 缓存机制和Hibernate的缓存机制介绍

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

随机推荐

  1. python 15 文件操作(一)

    转自 http://www.cnblogs.com/BeginMan/p/3166644.html 一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python ...

  2. Harry and magic string HDU - 5157 记录不相交的回文串对数

    题意: 记录不相交的回文串对数 题解: 正着反着都来一遍回文树 用sum1[i] 表示到 i 位置,出现的回文串个数的前缀和 sun2[i]表示反着的个数 ans+=sum1[i-1]*sum2[i] ...

  3. Oracle SQL外连接

    SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同.连接类型        定义内连接           只连接匹配的行左外连接     ...

  4. The linux command 之进程

    ******************查看进程********************* 一.使用ps命令 [me@linuxbox ~]$ ps PID TTY TIME CMD pts/ :: ba ...

  5. JS去除字符串拼接末尾的符号(逗号)

    前言:在JS中,有时需要进行字符串的拼接,而拼接的字符串以某种符号分隔,在拼接好的字符串末尾会多出一个分隔符,这时我们可以采取以下几种方法来去除末尾的分隔符. 方法一:使用substring()  和 ...

  6. static,final关键字,Object类的tostring方法,equals方法,hashCode方法

    1)static关键字 static可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访 ...

  7. Python自学:第五章 使用range( )创建数字列表

    # -*- coding: GBK -*- number = list(range(1,6)) print(number) 输出为: [1, 2, 3, 4, 5] 2. # -*- coding: ...

  8. 家庭-养老院模型理解IOC和DI

    控制反转 IOC 1. 概念 应用内部不负责依赖对象的创建和维护, 由第三方负责, 这样控制权就由应用内部转移到外部容器, 控制权的转移就是所谓的反转. 2. 比喻 有一户家庭(应用)有个老人(依赖对 ...

  9. [JZOJ6272] 2019.8.4【NOIP提高组A】整除

    题目 题目大意 求方程\((x^m-x)\mod n=0\)在整数范围\([1,n]\)的解的个数. \(n=\sum_{i=1}^{c}p_i\) 给出\(c\)和\(p_i\) 思考历程 作为数论 ...

  10. Pipe进程之间的通信

    #_author:来童星#date:2019/12/11#Pipefrom multiprocessing import Process, Pipedef f(conn): conn.send([42 ...