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 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
Python深入学习之对象的属性
Aug 31 Python
python生成词云的实现方法(推荐)
Jun 13 Python
python中的json总结
Oct 11 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
Python字符串及文本模式方法详解
Sep 10 Python
python生成word合同的实例方法
Jan 12 Python
python基于opencv批量生成验证码的示例
Apr 28 Python
如何在向量化NumPy数组上进行移动窗口
May 18 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
js实现文字滚动效果
2016/03/03 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
python threading模块操作多线程介绍
2015/04/08 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python em算法的实现
2020/10/03 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
烹饪自我鉴定
2014/03/01 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS