Django之缓存

Posted alexephor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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两者都要好点。

 

以上是关于Django之缓存的主要内容,如果未能解决你的问题,请参考以下文章

Django之缓存

django之缓存的用法, 文件形式与 redis的基本使用

Django进阶之缓存和信号

Django进阶之缓存和信号

Django之缓存

django高级之缓存与信号