zoukankan      html  css  js  c++  java
  • django-redis

    自定义连接池

    import redis
    from django.shortcuts import render,HttpResponse
    from utils.redis_pool import POOL
     
    def index(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.hset('kkk','age',18)
     
        return HttpResponse('设置成功')
    def order(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.hget('kkk','age')
     
        return HttpResponse('获取成功')
    views.py

    通过第三方组件操作redis

    安装

    pip3 install django-redis
    

     配置

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

    密码

      "LOCATION": "redis://:123123@127.0.0.1:6379",
    

    关于配置缓存时间

    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            # "LOCATION": "127.0.0.1:6379:3",
            "LOCATION": "redis://127.0.0.1:6379/3",
            'TIMEOUT': 600,# 缓存超时时间(默认300,None表示永不过期,0表示立即过期
            "OPTIONS": {
                "PASSWORD": "",
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            },
        },
     }
    

    正常来讲要设置成图示的这样,但是会报bug,改成

    "LOCATION": "127.0.0.1:6379:3",

    就好了,不知道为什么

    使用

    import redis
    from django.shortcuts import render,HttpResponse
    from django_redis import get_redis_connection
     
     
    def index(request):
        conn = get_redis_connection("default")
         conn.hset('kkk','age',18)
        return HttpResponse('设置成功')
    def order(request):
        conn = get_redis_connection("default")
        conn.hget('kkk','age')
        return HttpResponse('获取成功')
    views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
     
    from django.core.cache import cache
     
    class OrderView(APIView):
        def get(self,request,*args,**kwargs):
            # conn = get_redis_connection('default')
            cache.set('a','b')
            print(cache.get('a'))
            return Response('..')
    views.py

    全站缓存

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

    MIDDLEWARE = [
            'django.middleware.cache.UpdateCacheMiddleware',
            # 其他中间件...
            'django.middleware.cache.FetchFromCacheMiddleware',
        ]
    

     单独视图缓存

    方式一:通过装饰器

    from django.views.decorators.cache import cache_page
     
            @cache_page(60 * 15)
            def my_view(request):
                ...
    

     方式二:通过url

    from django.views.decorators.cache import cache_page
     
            urlpatterns = [
                url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
            ]
    

    局部页面缓存

    1. 引入TemplateTag

    {% load cache %}
    

     2. 使用缓存

    {% cache 5000 缓存的key %}
           缓存内容
    {% endcache %}
    
    2.5 django缓存优化
        ----目录---
        6.站点和view缓存
            settings.py
            #CACHE_MIDDLEWARE_ALIAS = 'default'
            CACHE_MIDDLEWARE_SECONDS = 3000
            CACHE_MIDDLEWARE_KEY_PREFIX = 'SiteCache'
            1.
            站点缓存:
            MIDDLEWARE_CLASSES=(
                'django.middleware.cache.UpdateCacheMiddleware', #第一
                'django.middleware.cache.CommonMiddleware',
                ....
                'django.middleware.cache.FetchFromCacheMiddleware', #最后
            )
            2.1
            view缓存,cache_page 装饰器会自动缓存view的response
            from django.views.decorators.cache import cache_page
            @cache_page(60*5,key_prefix='my_view_cache')
            def my_view(request):
                ....
            2.2 也可以在URLconf中使用
            urlpatterns = [
                url(r'^admin/', admin.site.urls),
                url(r'^home/(d+)/$',cache_page(50*6,key_prefix='home_cache')(home)),
                ]
        7. Template 与 Low-level 缓存
            至少需要两个参数 
            - timeout
            - name :缓存片段名称
            {% load cache %}
            <!--base.html-->
            {% block base_navigation_bar %}
                {% cache 60 navigation_bar  using='cache_alias' %}
                    {%  for category in category_list  %}
                        <li><a href="{% url 'category' %}?id={{ category.id }}">{{ category.name }}</a></li>
                    {% endfor %}
                {% endcache %}
            {% endblock %}
        8.redis + django
            ex 过期时间秒 px 过期时间毫秒
            nx key不存在时才设置K-V
            xx key存在时才设置K-V
            django 方法对应 redis命令
            def set         -> set/setes
            def get            -> get
            def add            -> setnx/expire
            def set_many    -> mset/setex
            def get_many    -> mget
            def incr        -> exists/incrby/get/set/setex
            def decr        -> def incr
            def has_key        -> exists
            def ttl            -> exists/ttl
            def expire        -> expire    #设置过期时间
            def persist        -> persist    #取消过期时间
            def delete        -> del
            def clear        -> flushdb/del
        9.django-redis 
            pip install django-redis-cache
            settings.py
                LOCATION 字段:
                    127.0.0.1:6379
                    redis://[:pwd]@127.0.0.1:6379/0
            ----
            CACHES = {
                'default': {
                    'BACKEND': 'redis_cache.RedisCache',
                    'LOCATION': 'redis://@192.168.1.7:6379/0',
                    'OPTIONS': {
                        # 'DB': 0,
                        # 'PASSWORD':  '',
                        # 'PARSER_CLASS': 'redis.connection.HiredisParser',
                        # 'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',
                        # 'PICKIE_VERSION': '-1',
                    },
                    'KEY_PREFIX': 'blog_',
                }
            }
            urls.py
            ----# 1. view 级别的缓存
            urlpatterns = [
                url(r'^$', cache_page(60*5)(index), name='index'),
                ...
            ]
            或者views.py
            @cache_page(60*5,key_prefix='my_view_cache')
            def index(request):
                ...
            
            ----templates 缓存
            html文件 
            {{ load cache }}
            {% cache 300 sidbar  using='cache_alias' %}
                ...
            {% endcache %}
        10.django redis 性能与优化
            django-debug-toolbar
            jmeter 压力测试
        @cached_property 装饰器 一个方法被多次调用并做同样的事情,可以缓存其返回值 
        -----------
        https://docs.djangoproject.com/en/1.8/topics/cache/
        pip install django_extensions
        settings.py
        ----
        CACHES = {
            'default':{
                'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION':'127.0.0.1:6789'
            }
            #'default':{
            #    'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
            #}
            
        }
        ----使用
        from django.core.cache import cache
        cache.set('k','hello,world',30) #30s超时
        cache.get('k')
        ----Caching API----
        per-site
        per-view
        python-object
        template-fragment
    View Code

    CACHE_BACKEND参数

    每个缓存后端都可能使用参数。 它们在CACHE_BACKEND设置中以查询字符串形式给出。 有效参数如下:

    每个缓存后端都可能使用参数。 它们在CACHE_BACKEND设置中以查询字符串形式给出。 有效参数如下:

    •     timeout:用于缓存的过期时间,以秒为单位。 这个参数默认被设置为300秒(五分钟)。
    •     max_entries:对于内存,文件系统和数据库后端,高速缓存允许的最大条目数,超出这个数则旧值将被删除。 这个参数默认是300。
    •     cull_percentage :当达到 max_entries 的时候,被删除的条目比率。 实际的比率是 1/cull_percentage ,所以设置cull_frequency=2就是在达到 max_entries 的时候去除一半数量的缓存。

        把 cull_frequency 的值设置为 0 意味着当达到 max_entries 时,缓存将被清空。 这将以很多缓存丢失为代价,大大提高接受访问的速度。

    在这个例子中, timeout 被设成 60

    而在这个例子中, timeout 设为 30 而 max_entries 为 400 :

    其中,非法的参数与非法的参数值都将被忽略。
    站点级 Cache

    一旦高速缓存设置,最简单的方法是使用缓存缓存整个网站。 您 需要添加'django.middleware.cache.UpdateCacheMiddleware'和 ‘django.middleware.cache.FetchFromCacheMiddleware'到您的MIDDLEWARE_CLASSES设置中,在这个例子中是:

    1
    2
    3
    4
    5
    MIDDLEWARE_CLASSES = (
     'django.middleware.cache.UpdateCacheMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.cache.FetchFromCacheMiddleware',
    )

    注意:

    不,这里并没有排版错误: 修改的中间件,必须放在列表的开始位置,而fectch中间件,必须放在最后。 细节有点费解,如果您想了解完整内幕请参看下面的MIDDLEWARE_CLASSES顺序。

    然后,在你的Django settings文件里加入下面所需的设置:

    •     CACHE_MIDDLEWARE_SECONDS :每个页面应该被缓存的秒数。
    •     CACHE_MIDDLEWARE_KEY_PREFIX :如果缓存被多个使用相同Django安装的网站所共享,那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一字符串,以避免key发生冲突。 如果你不在意的话可以设成空字符串。

    缓存中间件缓存每个没有GET或者POST参数的页面。 或者,如果CACHE_MIDDLEWARE_ANONYMOUS_ONLY设置为True,只有匿名请求(即不是由登录的用户)将被缓存。 如果想取消用户相关页面(user-specific pages)的缓存,例如Djangos 的管理界面,这是一种既简单又有效的方法。 CACHE_MIDDLEWARE_ANONYMOUS_ONLY,你应该确保你已经启动AuthenticationMiddleware。

    此外,缓存中间件为每个HttpResponse自动设置了几个头部信息:

    •     当一个新(没缓存的)版本的页面被请求时设置Last-Modified头部为当前日期/时间。
    •     设置Expires头部为当前日期/时间加上定义的CACHE_MIDDLEWARE_SECONDS。
    •     设置Cache-Control头部来给页面一个最长的有效期,值来自于CACHE_MIDDLEWARE_SECONDS设置。

    如果视图设置自己的缓存到期时间(即 它有一个最大年龄在头部信息的Cache-Control中),那么页面将缓存直到过期,而不是CACHE_MIDDLEWARE_SECONDS。使用django.views.decorators.cache装饰器,您可以轻松地设置视图的到期时间(使用cache_control装饰器)或禁用缓存视图(使用never_cache装饰器)。

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    linux系列之-—03 压缩和解压缩命令
    Atlassian Confluence安装
    常见ODBC及OLEDB连接串的写法
    windows 怎么验证域名是否开启了 https
    Jenkins基础篇 系列之-—05 集成JIRA
    SVN系列之—-SVN版本回滚的办法
    JMeter 系列之—-02 创建数据库测试计划
    golang web框架 beego 学习 (一) 环境搭建
    补充 3:Golang 一些特性
    补充 1: panic 、recover、 defer
  • 原文地址:https://www.cnblogs.com/weidaijie/p/10369787.html
Copyright © 2011-2022 走看看