Django 缓存配置Redis使用详解


Posted in Python onJuly 23, 2019

一、cache介绍

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。

缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

Django提供了6种缓存方式:

  • 开发调试缓存
  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)

这里不多介绍,有兴趣的可以去看看官方文档:https://docs.djangoproject.com/en/dev/topics/cache/

二、Redis缓存

要想在Django配置Redis缓存,则需要先安装依赖:

pip3 install django-redis

settings.py配置:

CACHES = {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
      "CONNECTION_POOL_KWARGS": {"max_connections": 100}
      # "PASSWORD": "密码",
    }
  }
}

视图中连接(手动操作redis):

from django.shortcuts import HttpResponse
from django_redis import get_redis_connection

def index(request):
  r = get_redis_connection("default")
  r.hmset("name_a", {"key_a": "value_a", "key_b": "value_b"})
  return HttpResponse("设置redis")

def order(request):
  r = get_redis_connection("default")
  val = r.hmget("name_a", ["key_a", "key_b"])
  print(val) # [b'value_a', b'value_b']
  return HttpResponse("获取redis")

三、应用

全站使用缓存

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

MIDDLEWARE = [
  'django.middleware.cache.UpdateCacheMiddleware', # 放在第一
  # 其他中间件...
  'django.middleware.cache.FetchFromCacheMiddleware', # 放在最后
]

CACHE_MIDDLEWARE_ALIAS = ""     # 用于存储的缓存别名
CACHE_MIDDLEWARE_SECONDS = 600    # 每个页面应缓存的秒数 
CACHE_MIDDLEWARE_KEY_PREFIX = ""   # 如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或此Django实例特有的其他字符串,以防止发生密钥冲突。如果你不在乎,请使用空字符串。

测试

from django.shortcuts import HttpResponseimport time
def index(request):
  t = time.time()
  return HttpResponse("时间:{}".format(str(t)))

def home(request):
  t = time.time()
  return HttpResponse("时间:{}".format(str(t)))

可以发现,index或者home页面第一次返回的时间是多少,往后10分钟以内,时间都是不变的。

单独视图缓存(记得取消全站缓存中间件配置)

from django.shortcuts import HttpResponse
from django.views.decorators.cache import cache_page
import time

@cache_page(60 * 10)
def index(request):
  t = time.time()
  return HttpResponse("时间:{}".format(str(t)))

def home(request):
  t = time.time()
  return HttpResponse("时间:{}".format(str(t)))

这次,index页面第一次访问返回的时间需要过10分钟再次访问才能变化,而home页面返回的时间是时时刻刻变化的。

模板局部视图使用

# 1.引入TemplateTag
  {% load cache %}

# 2.使用缓存
  {% cache 600 name %} # 缓存超时(秒) 和 缓存片段的名称(名称按原样使用)
    缓存内容
  {% endcache %}

示例:

# views.py
from django.shortcuts import render
import time

def index(request):
  t = time.time()
  return render(request, "index.html", {"t": t})
# index.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

{% load cache %}

{% cache 10 current_time %}
  <h1>{{ t }}</h1>
{% endcache %}

</body>
</html>

四、使用场景说明

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

from django.shortcuts import render
def index(request):
  # 读取数据库等 并渲染到网页
  # 数据库获取的结果保存到 queryset 中
  return render(request, 'index.html', {'queryset':queryset})
# 像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候, 就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。

#--------------------------------------------------------------------

from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
@cache_page(60 * 10) # 秒数,这里指缓存10分钟,不直接写600是为了提高可读性
def index(request):
  # 读取数据库等 并渲染到网页
  return render(request, 'index.html', {'queryset':queryset})
# 当使用了cache后,访问情况变成了如下:访问一个网址时, 尝试从 cache 中找有没有 缓存内容,如果需要的数据在缓存中没有缓存内容,则去数据库取,渲染返回页面,同时 将这些数据保存在缓存中,在一定时间内,当用户再次访问页面时,就没必要去数据库取 了,直接从缓存中拿到数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python向日志输出中添加上下文信息
May 24 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
Jul 10 Python
python如何重载模块实例解析
Jan 25 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
python 列表推导式使用详解
Aug 29 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
python小白切忌乱用表达式
May 29 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 #Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 #Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 #Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 #Python
flask框架路由常用定义方式总结
Jul 23 #Python
python处理大日志文件
Jul 23 #Python
Django urls.py重构及参数传递详解
Jul 23 #Python
You might like
一篇不错的PHP基础学习笔记
2007/03/18 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
php构造函数实例讲解
2013/11/13 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
自动更新作用
2006/10/08 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
Python进程间通信用法实例
2015/06/04 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
Python基础之文件读取的讲解
2019/02/16 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
pytorch实现查看当前学习率
2020/06/24 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
经典c++面试题四
2015/05/14 面试题
学位证书委托书
2014/09/30 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
优秀教师先进材料
2014/12/16 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers