zoukankan      html  css  js  c++  java
  • Django 缓存之配置Redis

    一、cache介绍

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存。

    缓存工作原理:缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有用户来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。

    Django提供了6种缓存方式:

    • 开发调试缓存
    • 内存缓存
    • 文件缓存
    • 数据库缓存
    • Memcache缓存(使用python-memcached模块)
    • Memcache缓存(使用pylibmc模块)

    这里不多介绍,有兴趣的可以去看看官方文档:https://docs.djangoproject.com/en/dev/topics/cache/

    二、Redis缓存

    要想在Django配置Redis缓存,则需要先安装依赖:

    pip3 install django-redis

    settings.py配置:

    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": "密码",
            }
        }
    }

    视图中连接(手动操作redis):

    from django.shortcuts import HttpResponse
    from django_redis import get_redis_connection
    
    def index(request):
        r = get_redis_connection("default")
        r.hmset("name_a", {"key_a": "value_a", "key_b": "value_b"})
        return HttpResponse("设置redis")
    
    def order(request):
        r = get_redis_connection("default")
        val = r.hmget("name_a", ["key_a", "key_b"])
        print(val)  # [b'value_a', b'value_b']
        return HttpResponse("获取redis")

    三、应用

    全站使用缓存

    使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用 FetchFromCacheMiddleware 获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware 会将缓存保存至缓存,从而实现全站缓存。

    MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',  # 放在第一
        # 其他中间件...
        'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后
    ]
    
    CACHE_MIDDLEWARE_ALIAS = ""          # 用于存储的缓存别名
    CACHE_MIDDLEWARE_SECONDS = 600       # 每个页面应缓存的秒数 
    CACHE_MIDDLEWARE_KEY_PREFIX = ""     # 如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或此Django实例特有的其他字符串,以防止发生密钥冲突。如果你不在乎,请使用空字符串。

    测试:

    from django.shortcuts import HttpResponseimport time
    def index(request):
        t = time.time()
        return HttpResponse("时间:{}".format(str(t)))
    
    def home(request):
        t = time.time()
        return HttpResponse("时间:{}".format(str(t)))

    可以发现,index或者home页面第一次返回的时间是多少,往后10分钟以内,时间都是不变的。

    单独视图缓存(记得取消全站缓存中间件配置)

    from django.shortcuts import HttpResponse
    from django.views.decorators.cache import cache_page
    import time
    
    @cache_page(60 * 10)
    def index(request):
        t = time.time()
        return HttpResponse("时间:{}".format(str(t)))
    
    def home(request):
        t = time.time()
        return HttpResponse("时间:{}".format(str(t)))

    这次,index页面第一次访问返回的时间需要过10分钟再次访问才能变化,而home页面返回的时间是时时刻刻变化的。

    模板局部视图使用

    # 1.引入TemplateTag
        {% load cache %}
    
    # 2.使用缓存
        {% cache 600 name %}  # 缓存超时(秒) 和 缓存片段的名称(名称按原样使用)
            缓存内容
        {% endcache %}

    示例:

    # views.py
    from django.shortcuts import render
    import time
    
    def index(request):
        t = time.time()
        return render(request, "index.html", {"t": t})
    # index.html
    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    {% load cache %}
    
    {% cache 10 current_time %}
        <h1>{{ t }}</h1>
    {% endcache %}
    
    </body>
    </html>

    四、使用场景说明

    # 一般来说我们用 Django 来搭建一个网站,要用到数据库等。
    
    from django.shortcuts import render
    def index(request):
        # 读取数据库等 并渲染到网页
        # 数据库获取的结果保存到 queryset 中
        return render(request, 'index.html', {'queryset':queryset})
    # 像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,  就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。
    
    #--------------------------------------------------------------------
    
    from django.shortcuts import render
    from django.views.decorators.cache import cache_page
     
    @cache_page(60 * 10)  # 秒数,这里指缓存10分钟,不直接写600是为了提高可读性
    def index(request):
        # 读取数据库等 并渲染到网页
        return render(request, 'index.html', {'queryset':queryset})
    # 当使用了cache后,访问情况变成了如下:访问一个网址时, 尝试从 cache 中找有没有  缓存内容,如果需要的数据在缓存中没有缓存内容,则去数据库取,渲染返回页面,同时  将这些数据保存在缓存中,在一定时间内,当用户再次访问页面时,就没必要去数据库取  了,直接从缓存中拿到数据。
  • 相关阅读:
    bzoj 1210 [HNOI2004] 邮递员 插头dp
    与非 乱搞233
    USACO JAN14 奶牛冰壶运动 凸包+判定
    bzoj 2829 计算几何
    R
    bzoj 1592 dp
    [Usaco2007 Open]Fliptile 翻格子游戏 状压dp
    拯救莫莉斯 状压dp
    大暑假集训 第一阶段总结 233
    hdu 1693 Eat the Trees 插头dp
  • 原文地址:https://www.cnblogs.com/believepd/p/10275384.html
Copyright © 2011-2022 走看看