简单了解django缓存方式及配置


Posted in Python onJuly 19, 2019

前言

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

1. 缓存的概述:

缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

2. Django中提供了6种缓存方式:

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

2.1 配置

开发调试

# 此为开始调试用,实际内部不做任何操作
 # 配置:
  CACHES = {
   'default': {
    'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 引擎
    'TIMEOUT': 300,            # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
    'OPTIONS':{
     'MAX_ENTRIES': 300,          # 最大缓存个数(默认300)
     'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
    },
    'KEY_PREFIX': '',            # 缓存key的前缀(默认空)
    'VERSION': 1,             # 缓存key的版本(默认1)
    'KEY_FUNCTION' 函数名           # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
   }
  }


 # 自定义key
 def default_key_func(key, key_prefix, version):
  """
  Default function to generate keys.

  Constructs the key used by all other methods. By default it prepends
  the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
  function with custom key making behavior.
  """
  return '%s:%s:%s' % (key_prefix, version, key)

 def get_key_func(key_func):
  """
  Function to decide which key function to use.

  Defaults to ``default_key_func``.
  """
  if key_func is not None:
   if callable(key_func):
    return key_func
   else:
    return import_string(key_func)
  return default_key_func

内存

# 此缓存将内容保存至内存的变量中
 # 配置:
  CACHES = {
   'default': {
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    'LOCATION': 'unique-snowflake',
   }
  }

 # 注:其他配置同开发调试版本

文件

# 此缓存将内容保存至文件
 # 配置:

  CACHES = {
   'default': {
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
    'LOCATION': '/var/tmp/django_cache',
   }
  }
 # 注:其他配置同开发调试版本

数据库

# 此缓存将内容保存至数据库

 # 配置:
  CACHES = {
   'default': {
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
    'LOCATION': 'my_cache_table', # 数据库表
   }
  }

 # 注:执行创建表命令 python manage.py createcachetable

Memcache缓存(python-memcached模块)

# 此缓存使用python-memcached模块连接memcache

 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
   'LOCATION': '127.0.0.1:11211',
  }
 }

 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
   'LOCATION': 'unix:/tmp/memcached.sock',
  }
 } 

 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
   'LOCATION': [
    '172.19.26.240:11211',
    '172.19.26.242:11211',
   ]
  }
 }

Memcache缓存(pylibmc模块)

# 此缓存使用pylibmc模块连接memcache
 
 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
   'LOCATION': '127.0.0.1:11211',
  }
 }

 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
   'LOCATION': '/tmp/memcached.sock',
  }
 } 

 CACHES = {
  'default': {
   'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
   'LOCATION': [
    '172.19.26.240:11211',
    '172.19.26.242:11211',
   ]
  }
 }

Redis缓存(依赖:pip3 install django-redis)

from django_redis import get_redis_connection
conn = get_redis_connection("default")

2.2 应用

全站使用

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

 MIDDLEWARE = [
  'django.middleware.cache.UpdateCacheMiddleware',
  # 其他中间件...
  'django.middleware.cache.FetchFromCacheMiddleware',
 ]

 CACHE_MIDDLEWARE_ALIAS = ""
 CACHE_MIDDLEWARE_SECONDS = ""
 CACHE_MIDDLEWARE_KEY_PREFIX = ""

单独视图缓存

方式一:
  from django.views.decorators.cache import cache_page

  @cache_page(60 * 15)
  def my_view(request):
   ...

 方式二:
  from django.views.decorators.cache import cache_page

  urlpatterns = [
   url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
  ]

局部视图使用

a. 引入TemplateTag

  {% load cache %}

 b. 使用缓存

  {% cache 5000 缓存key %}
   缓存内容
  {% endcache %}

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

Python 相关文章推荐
跟老齐学Python之眼花缭乱的运算符
Sep 14 Python
Python编程中的反模式实例分析
Dec 08 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
对Python 内建函数和保留字详解
Oct 15 Python
python3 读取Excel表格中的数据
Oct 16 Python
python实现windows壁纸定期更换功能
Jan 21 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
python binascii 进制转换实例
Jun 12 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
python手机号前7位归属地爬虫代码实例
Mar 31 Python
django和flask哪个值得研究学习
Jul 31 Python
利用python调用摄像头的实例分析
Jun 07 Python
python实现最小二乘法线性拟合
Jul 19 #Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 #Python
python如何实现数据的线性拟合
Jul 19 #Python
django获取from表单multiple-select的value和id的方法
Jul 19 #Python
django 信号调度机制详解
Jul 19 #Python
python傅里叶变换FFT绘制频谱图
Jul 19 #Python
Django forms表单 select下拉框的传值实例
Jul 19 #Python
You might like
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
js模块加载方式浅析
2017/08/12 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
KMP算法精解及其Python版的代码示例
2016/06/01 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
python模块如何查看
2020/06/16 Python
python如何删除文件、目录
2020/06/23 Python
Pandas的数据过滤实现
2021/01/15 Python
高中政治教学反思
2014/01/18 职场文书
策划创业计划书
2014/02/06 职场文书
交通事故协议书
2014/04/15 职场文书
2015年护士节活动总结
2015/02/10 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
导游词之日月潭
2019/11/05 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript