博客源为书写的载体,书写以对思维的缓存 正文

Django-redis缓存


对于大部分网站来说缓存的重要性不言而喻,缓存可以为我们保存那些需要很多计算资源的数据,从而避免重复消耗计算资源。Django带有一个健壮的缓存系统来保存动态页面,并且提供了不同级别的缓存粒度:可以缓存特定视图的输出、缓存URL、缓存模板片段、或者可以缓存整个网站。

缓存方式:

Django提供了多种缓存方式,不同的缓存方式对应着不同的缓存性能

1.Memcache缓存:Memcache是Django本身支持的最快,最有效的缓存方式,它是一个完全基于内存的缓存服务器,并且能够在多个服务器上共享缓存,但是因为缓存的数据存储在内存中,如果服务器崩溃,数据将会丢失,慎用。

2.本地内存缓存:默认缓存,如果你想拥有内存缓存的速度优势但不需要像Memcached那么多的功能,可以考虑本地内存缓存。但是弊端和Memcache一样,慎用。

3.文件系统缓存:将数据缓存到本地文件中。

4.虚拟缓存(用于开发):实际上并不缓存,它只是实现缓存接口而不做任何事情。

5.数据库缓存:将数据缓存到数据库中,最常用的缓存方式也是本文讲解的主要内容--将数据缓存到redis数据库中。

对于这几种缓存方式的详细内容请查看官方文档:https://docs.djangoproject.com/zh-hans/2.1/topics/cache/#setting-up-the-cache

设置缓存:

1.安装django-redis

pip install django-redis

django-redis官方文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/

2.通过在settings.py文件中添加CACHES项来进行配置

CACHES={
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',        # 采用1数据库
        'OPTIONS': { 
           'CLIENT_CLASS": "django_redis.client.DefaultClient',
        }
    }
}

如果你的redis数据库设置了登录密码,请这样填写'LOCATION'项:

'LOCATION': 'redis://:你的密码@服务器地址:6379/1',

使用缓存:

1.视图中使用缓存(缓存整个页面)

函数视图缓存

django.views.decorators.cache定义了cache_page装饰器,用于对函数视图的输出进行缓存。

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def index(request):
    return HttpResponse('hello world')

类视图缓存

from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator
from django.views.generic.base import View

class IndexView(View):
    @method_decorator(cache_page(60 * 15))
    def get(self, request):
        return HttpResponse('hello world')

类中的方法与函数并不完全相同,因此不能将函数装饰器应用于类中的方法上,需要先将其转换为方法装饰器。method_decorator装饰器可以将函数装饰转换成方法装饰。

详细内容可见官方文档:https://docs.djangoproject.com/zh-hans/2.1/topics/class-based-views/intro/#decorating-the-class

2.URLconf中使用缓存(缓存整个页面)

from django.views.decorators.cache import cache_page

urlpatterns = [    
    url(r'^$', cache_page(60 * 15)(index_view)),     # 函数视图 
    url(r'^$', cache_page(60 * 15)(IndexView.as_view()), name='index'),    # 类视图
]

3.模板使用缓存(缓存指定部分)

{% load cache %}

{% cache 500 hello %}
    <p>hello world</p>
{% endcache %}

通过cache标签,需要两个参数:缓存时间(单位:秒)、给缓存片段取个别名。模板缓存可以根据实际需求灵活的运用,充分的考虑了缓存的粒度划分,我的博客主要使用这种缓存。

4.底层缓存(缓存指定部分)

from django.core.cache import cache

设置:cache.set(键,值,有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear()

与模板缓存类似的,我们也可以在视图中缓存指定的部分数据或内容。Django提供了一个底层缓存API,你可以使用此API以任意级别的粒度在缓存中存储对象。

5.全站缓存

如果你想缓存整个网站,需要在settings.py文件中的MIDDLEWARE项添加相应的中间件: 

'django.middleware.cache.UpdateCacheMiddleware' 和 'django.middleware.cache.FetchFromCacheMiddleware'

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 放在第一个
    ...其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后一个
    ]
    
# 另外的配置项
CACHE_MIDDLEWARE_SECONDS= 60     # 每个页面缓存的时间(单位:秒)
CACHE_MIDDLEWARE_ALIAS='xxx'     # 缓存别名

执行流程图解:

8j9lg95edl.png

总结:

缓存是把双刃剑,在合适的时间、地点、环境下合理的选择缓存,能够减轻服务器压力提升网站性能,反之并不会带来太大的好处。缓存尽量使用在不经常变动的页面上。

最后:

images2.jpg