Django之缓存
自定义使用redis(可以跨其它的框架)
utils文件下创建redis_pool.py文件,设计成单例模式
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import redis 4 5 POOL = redis.ConnectionPool(host='10.10.10.10', port=6379, password='nishisbsbsb', max_connections=500)
views.py
1 import redis 2 from django.shortcuts import render, HttpResponse 3 from utils.redis_pool import POOL 4 5 6 def index(request): 7 conn = redis.Redis(connection_pool=POOL) 8 conn.hset('kkk', 'age', 18) 9 return HttpResponse('设置值') 10 11 12 def order(request): 13 conn = redis.Redis(connection_pool=POOL) 14 conn.hget('kkk', 'age') 15 return HttpResponse('获取值')
使用第三方组件手动操作redis(只适用在Django中)
1 pip3 install django-redis -i https://pypi.douban.com/simple
settings文件配置:
1 # redis配置 2 CACHES = { 3 "default": { 4 "BACKEND": "django_redis.cache.RedisCache", 5 "LOCATION": "redis://127.0.0.1:6379", 6 "OPTIONS": { 7 "CLIENT_CLASS": "django_redis.client.DefaultClient", 8 "CONNECTION_POOL_KWARGS": {"max_connections": 100} 9 # "PASSWORD": "密码", 10 } 11 }, 12 }
使用:
1 from django.shortcuts import render, HttpResponse 2 from django_redis import get_redis_connection 3 4 5 def index(request): 6 conn = get_redis_connection('default') 7 return HttpResponse('设置值')
高级使用:
全网站每个页面都进行缓存 (使用频率不是很高,全站)缓存流程图
ps:
2位置存放:经过所有中间件通过之后存放
4位置存放:中间件写的session_id、请求相关status码等等回到第一个中间件再往redis里边存放
配置:
1 # redis配置 2 CACHES = { 3 "default": { 4 "BACKEND": "django_redis.cache.RedisCache", 5 "LOCATION": "redis://127.0.0.1:6379", 6 "OPTIONS": { 7 "CLIENT_CLASS": "django_redis.client.DefaultClient", 8 "CONNECTION_POOL_KWARGS": {"max_connections": 100} 9 # "PASSWORD": "密码", 10 } 11 }, 12 }
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
1 MIDDLEWARE = [ 2 'django.middleware.cache.UpdateCacheMiddleware', 3 'django.middleware.security.SecurityMiddleware', 4 'django.contrib.sessions.middleware.SessionMiddleware', 5 'django.middleware.common.CommonMiddleware', 6 'django.middleware.csrf.CsrfViewMiddleware', 7 'django.contrib.auth.middleware.AuthenticationMiddleware', 8 'django.contrib.messages.middleware.MessageMiddleware', 9 'django.middleware.clickjacking.XFrameOptionsMiddleware', 10 'django.middleware.cache.FetchFromCacheMiddleware', 11 ] 12 13 CACHE_MIDDLEWARE_ALIAS = "" 14 CACHE_MIDDLEWARE_SECONDS = "" 15 CACHE_MIDDLEWARE_KEY_PREFIX = ""
单独视图缓存
先注释掉全局两个关于缓存的中间件
在视图上加装饰器
1 import time 2 from django.shortcuts import render, HttpResponse 3 from django.views.decorators.cache import cache_page 4 5 6 @cache_page(60 * 15) # 优先级高,有这个就用这个,就不用全局的 7 def index(request): 8 ctime = str(time.time()) 9 return HttpResponse(ctime)
在路由设置上
1 from django.urls import path 2 from django.views.decorators.cache import cache_page 3 from api import views 4 5 urlpatterns = [ 6 path('index/', cache_page(60 * 15)(views.index)), 7 ]
在模板加
1 def order(request): 2 return render(request, 'order.html')
1 {% load cache %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title></title> 7 </head> 8 <body> 9 <h1>aaaaa</h1> 10 <div>sddaad</div> 11 12 {% cache 5000 缓存key %} 13 <div>5000s超时 这里边的东西要缓存</div> 14 {% endcache %} 15 16 </body> 17 </html>
Django提供6中缓存方式:
开发调试:
1 # 此为开始调试用,实际内部不做任何操作 2 # 配置: 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 6 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 7 'OPTIONS':{ 8 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 9 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) 10 }, 11 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 12 'VERSION': 1, # 缓存key的版本(默认1) 13 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】) 14 } 15 } 16 17 18 # 自定义key 19 def default_key_func(key, key_prefix, version): 20 """ 21 Default function to generate keys. 22 23 Constructs the key used by all other methods. By default it prepends 24 the `key_prefix'. KEY_FUNCTION can be used to specify an alternate 25 function with custom key making behavior. 26 """ 27 return '%s:%s:%s' % (key_prefix, version, key) 28 29 def get_key_func(key_func): 30 """ 31 Function to decide which key function to use. 32 33 Defaults to ``default_key_func``. 34 """ 35 if key_func is not None: 36 if callable(key_func): 37 return key_func 38 else: 39 return import_string(key_func) 40 return default_key_func
内存:
1 # 此缓存将内容保存至内存的变量中 2 # 配置: 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 6 'LOCATION': 'unique-snowflake', 7 } 8 } 9
文件:
1 # 此缓存将内容保存至文件 2 # 配置: 3 4 CACHES = { 5 'default': { 6 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 7 'LOCATION': '/var/tmp/django_cache', 8 } 9 }
数据库:
1 # 此缓存将内容保存至数据库 2 3 # 配置: 4 CACHES = { 5 'default': { 6 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 7 'LOCATION': 'cachdb2', # 数据库表 8 } 9 } 10 11 # 注:执行创建表命令 python manage.py createcachetable
Memcache缓存:
1 # 此缓存使用python-memcached模块连接memcache 2 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 6 'LOCATION': '127.0.0.1:11211', 7 } 8 } 9 10 CACHES = { 11 'default': { 12 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 13 'LOCATION': 'unix:/tmp/memcached.sock', 14 } 15 } 16 17 CACHES = { 18 'default': { 19 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 20 'LOCATION': [ 21 '127.0.0.1:11211', 22 '127.0.0.1:11211', 23 ] 24 } 25 }
Memcache与Redis: Memcache支持的数据类型少,而且断电了真没了,不能支持持久化,而Redis两者都要好点。