• 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两者都要好点。

  • 相关阅读:
    国庆·生日
    国足
    Eason's concert
    今天的斩获
    The 4400
    闷热
    24
    一直登录不了。。。原来是因为。。。
    黄色暴雨警告
    绝密飞行
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11317505.html
Copyright © 2020-2023  润新知