• django 缓存 实现


     

     

    由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存memcached 、Redis中之前缓存的内容拿到,并返回。

    一、Django缓存的配置和应用

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

    • 开发调试  (开发调试使用)
    • 内存(不做配置默认:默认配置是Django内置配置文件(用户不可见)设置在内存里面)
    • 文件
    • 数据库
    • Memcache缓存(python-memcached模块)
    • Memcache缓存(pylibmc模块)

    Django的缓存到底存储在哪里是根据Django的 setings.py配置文件来决定的!

    1、配置  在Django项目setings.py中配置 

    a、缓存至内存:

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',#缓存到内存
            'LOCATION': 'XXOO',     #在内存中存储的变量(保证唯一)
            'TIMEOUT': 300,            # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
            'OPTIONS':{
                'MAX_ENTRIES': 300,     # 最大缓存个数(默认300)
                'CULL_FREQUENCY': 3,
                # 缓存到达最大个数之后,Django会自动清空3/1 ,设置为10 就剔除10/1
            }
        }
    }
    View Code

    b、缓存至目录文件

    会不会有这样的疑惑?如果把数据缓存至本地目录,和去数据库里获取数据有什么区别?

    1、缓存的内容和数据库里不一样,是经过模板渲染处理好的整体数据;而去数据库获取数据还需要模板渲染进行加工处理;

    2、距离不一样,缓存到本地目录,而Django连接数据库需要socket;

    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'LOCATION': '/var', #设置缓存文件的目录
        }
    }
    View Code

    c、缓存至数据库

    缓存到数据库也好,至少相对而言少了模板渲染的过程;

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

    d1、缓存到Memcache数据库(python-memcached模块)

    # 此缓存使用python-memcached模块连接memcache
         
                          
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': '127.0.0.1:11211',       #通过网络socket连接,缓存到单台服务的 memcache数据库
            }
        }
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': 'unix:/tmp/memcached.sock',  #通过本地文件socket,缓存本机memcache数据库
            }
        }   
    
    
                                                          #通过网络socket连接,缓存到memcache 集群
        CACHES = {                                        #其中 6和89为
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': [
                    ('172.19.26.240:11211',6),                   
                    ('172.19.26.242:11211',89),                 
                ]
            }
        }
    View Code

    d2、Memcache缓存(pylibmc模块)

    还可以使用其他Python模块连接到Memcache,老铁你是否联想到了 redis?默认还不支持!需要借助第三方插件;

    # 此缓存使用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',
                ]
            }
        }
    View Code

    2、应用 

    a、全站缓存(大粒度应用)

    全站应用缓存就是对 客户端所有request应用,提到所有请求 我就联想到了Django的中间件。

    来看一张图

     你认为request请求进来,这个缓存中间件应该设置在中间件2 因为 要先请求进来,要先经过CSRF中间件,因为不合法的request,缓存也不应该给让他看到;

    再看一张图

    response请求响应之后,这个缓存中间件应该设置放在最后中间件4,避免之前的中间件修改过response的内容,造成缓存和数据库内容不一致;

    Django缓存的中间件Django已经帮我们准备好了,我们只需要添加上就OK了;

    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',
    
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
    
    CACHE_MIDDLEWARE_SECONDS = 10  #设置超时时间 10秒
    View Code

    b、视图函数应用(适中粒度应用)

    from django.views.decorators.cache import cache_page  #导入设置缓存的装饰器
    @cache_page(60 * 5) #注意 60*3 是缓存时间为3分钟,(3)3秒,如果更换了设置,千万记得更新url,否则会使用原来设置的过期时间,和原来的缓存;
    def index(request):
        userlist=models.UserInfo.objects.all()
        ctime=time.time()
        return render(request,'index.html',locals())
    @cache_page(5)
    def test(request):
        # userlist=models.UserInfo.objects.all()
        ctime=time.time()
        return render(request,'index.html',locals())
    View Code
    #注意 60*3 是缓存时间为3分钟,(3)3秒,如果更换了设置,千万记得更新url,否则会使用原来设置的过期时间,和原来的缓存;

    c、局部模板应用缓存(小粒度应用)

    缓存应该加在我们网站页面不实时更新的地方;

    {% load cache %}     {#1、首先加载缓存#}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
    
    {% cache 5000 缓存key %} {# 2 用cache tag 围绕 要缓存的内容#}
        <p>缓存内容</p>
    {% endcache %}
    View Code
  • 相关阅读:
    每周一练 之 数据结构与算法(Tree)
    每周一练 之 数据结构与算法(Dictionary 和 HashTable)
    【CuteJavaScript】GraphQL真香入门教程
    每周一练 之 数据结构与算法(LinkedList)
    每周一练 之 数据结构与算法(Stack)
    每周一练 之 数据结构与算法(Set)
    每周一练 之 数据结构与算法(Queue)
    《JavaScript 正则表达式迷你书》知识点小抄本
    玩转CSS3(二)---CSS3实现瀑布布局
    玩转CSS3(一)----CSS3实现页面布局
  • 原文地址:https://www.cnblogs.com/zxmbky/p/10216773.html
Copyright © 2020-2023  润新知