Django之缓存

一:缓存

(1)基础概念

作用:

简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求的时候 直接去缓存中而不是去数据库中,减少了对数据库的访问,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时时间,缓存一般用在数据变化不大,实时率不高的情况下。

优点:

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内(默认配置)再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

(2)缓存方式

1:开发调试

2:内存

3:文件

4:数据库

5:Memcache缓存(python-memcached模块)

6:Memcache缓存(pylibmc模块)

二:缓存配置方式

1:开发调试模式(此模式为开发调试模式 无任何生产意义)

settings.py文件中配置

        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

2:内存(将数据缓存到内存中)

settings.py文件中配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
        'LOCATION': 'unique-snowflake',         # 给内存中的缓存设置名字
        'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

3:文件(将缓存放入文件中)

settings.py文件中配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
        'LOCATION': 'D:\test\cache',        # 指定缓存的路径
        'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS':{
            'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

4:数据库(缓存存入数据库)

settings.py文件中配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
        'LOCATION': 'cache_table',          # 数据库表
        'OPTIONS':{
            'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

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

5:Memcache缓存(python-memcached模块)

settings.py文件中配置

# Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
        'LOCATION': '192.168.10.100:8888',         # 指定Memcache缓存服务器的IP地址和端口
        'OPTIONS':{
            'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

 # location配置方式也可以如下
'
LOCATION': 'unix:/tmp/memcached.sock', # 指定局域网内的主机名加socket套接字为Memcache缓存服务器

'LOCATION': [ # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器 '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]

 6:Memcache缓存(pylibmc模块)

settings.py文件中配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',  # 指定缓存使用的引擎
        'LOCATION':'192.168.10.100:11211',         # 指定本机的11211端口为Memcache缓存服务器
        'OPTIONS':{
            'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        },
    }
}


# LOCATION 也可以如下配置

'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
'LOCATION': [         # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
    '192.168.10.100:11211',
    '192.168.10.101:11211',
    '192.168.10.102:11211',
]

7:redis缓存(依赖于 pip install django-redis)

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": "密码",
        }
    }
}
# 视图中操作
from django_redis import get_redis_connection
conn = get_redis_connection("default")

三:缓存应用

缓存颗粒:Django提供了不同粒度的缓存,可以缓存某个页面,可以只缓存一个页面的某个部分,甚至可以缓存整个网站.

(1)单视图函数缓存

settings

CACHES = {
    'default': {
       
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎

        'LOCATION': 'unique-snowflake',          # 指定缓存的路径
        'TIMEOUT': 300,              # 缓存超时时间(默认为300秒,None表示永不过期)
        'OPTIONS': {
            'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
            'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
        }
    }
}

视图层

from django.shortcuts import render
from app01 import models
from django.views.decorators.cache import cache_page
import time

@cache_page(15)  #  超时时间为15秒
def index(request):
    user_obj = models.UserInfo.objects.all()
    ctime = time.time()
    return render(request, "index.html", {"user_list": user_obj, "ctime": ctime})

模板层

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://cn.vuejs.org/js/vue.min.js"></script>
</head>
<body>
<h1>{{ ctime }}</h1>
<ul>
    {% for user in user_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
</ul>
</body>
</html>

PS

  (1)因为缓存的原因,不停的刷新浏览器时会发现,页面上显示的时间每15秒钟变化一次.

  (2)在立即刷新浏览器的时候,立即在数据库中添加一个用户对象,此时继续刷新浏览器,前端页面上不会显示刚才添加的用户

  (3)一直刷新浏览器15秒后,新添加的用户才用在前端页面上显示出来.

(2)全站使用

  (1)既然是全站缓存,当然要使用Django中的中间件.

  (2)用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户

  (3)当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存

 MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
        # 其他中间件...
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
  CACHE__MIDDLEWARE_SECONDS=15         # 设定超时时间为15秒

(3)局部视图缓存

例子,刷新页面时,整个网页有一部分实现缓存

views视图函数

from django.shortcuts import render
import time
 
def index(request):

 ctime = time.time()
 return render(request,'index.html',{'ctime':ctime})

 前端网页

# a. 引入TemplateTag
        {% load cache %}
# b. 使用缓存
        {% cache 5000 缓存key %}
            缓存内容
        {% endcache %}
{% load cache %}    # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
{% cache 15 'aaa' %}   # 设定超时时间为15秒
 <h1>{{ ctime }}</h1>
{% endcache %}
</body>
</html>

 

posted @ 2020-03-02 21:00  SR丶  阅读(254)  评论(0编辑  收藏