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 相关文章推荐
Django实现快速分页的方法实例
Oct 22 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Python+OpenCV实现将图像转换为二进制格式
Jan 09 Python
使用TFRecord存取多个数据案例
Feb 17 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
python3.4中清屏的处理方法
Jul 06 Python
python实现录制全屏和选择区域录屏功能
Feb 05 Python
Python 数据科学 Matplotlib图库详解
Jul 07 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
JavaScript自定义事件介绍
2013/08/29 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
python统计日志ip访问数的方法
2015/07/06 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python接口开发实现步骤详解
2020/04/26 Python
python mysql中in参数化说明
2020/06/05 Python
Puma印度官网:德国运动品牌
2019/10/06 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
撤诉申请怎么写
2015/05/19 职场文书
导游词之贵州织金洞
2019/10/12 职场文书