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装饰器)。

posted @ 2019-02-13 14:46  离人怎挽_wdj  阅读(180)  评论(0编辑  收藏  举报