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 相关文章推荐
推荐11个实用Python库
Jan 23 Python
详解Python的单元测试
Apr 28 Python
Python pymongo模块用法示例
Mar 31 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
Django的CVB实例详解
Feb 10 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
Python实现画图软件功能方法详解
Jul 28 Python
Python内置函数property()如何使用
Sep 01 Python
详解Scrapy Redis入门实战
Nov 18 Python
Python3 类型标注支持操作
Jun 02 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+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
js兼容的placeholder属性详解
2013/08/18 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Django进阶之CSRF的解决
2018/08/01 Python
Python引用计数操作示例
2018/08/23 Python
Python中Numpy mat的使用详解
2019/05/24 Python
利用python实现AR教程
2019/11/20 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
先进德育工作者事迹材料
2014/01/24 职场文书
法律七进实施方案
2014/03/15 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
班主任自我评价范文
2015/03/11 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
python3实现常见的排序算法(示例代码)
2021/07/04 Python
利用python做数据拟合详情
2021/11/17 Python
微信小程序实现轮播图指示器
2022/06/25 Javascript