Django缓存机制以及使用redis缓存数据库

Django 配置缓存机制

**Django ** 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。而使用缓存的话,可以将数据保存在缓存中,下次访问的时候直接从缓存中获得数据,而不用去请求后端数据库,这样服务器可以很快的响应请求,从而提高加载速度。

缓存系统工作原理

对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容。

一般来说我们用 Django 来搭建一个网站,要用到数据库等。

from django.shortcuts import render
def index(request):
    # 读取数据库等 并渲染到网页
    # 数据库获取的结果保存到 queryset 中
    return render(request, 'index.html', {'book_list':book_list})

像这样每次访问都要读取数据库,一般的小网站没什么问题,当访问量非常大的时候,就会有很多次的数据库查询,肯定会造成访问速度变慢,服务器资源占用较多等问题。

当使用了cache后,访问情况就变化了。

from django.shortcuts import render
from django.views.decorators.cache import cache_page

@cache_page(60 * 15) # 秒数,这里指缓存 15 分钟,不直接写900是为了提高可读性
def index(request):
    # 读取数据库等 并渲染到网页
    return render(request, 'index.html', {'book_list':book_list})


# 访问一个网址时, 尝试从 cache 中找有没有缓存内容
# 如果网页在缓存中显示缓存内容,否则生成访问的页面,保存在缓存中以便下次使用,显示缓存的页面。

Django settings 中 默认cache

也就是默认利用本地的内存来当缓存,速度很快。

当然可能出来内存不够用的情况

from  django.conf import settings
print(settings.CACHES)
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}


{
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

下面我们就来介绍一下各种缓存的配置:

缓存配置

利用文件系统来缓存

这个很简单,就是将数据缓存在指定的目录中。配置如下:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/var/tmp/django_cache',	# linux 中的目录,前提目录必须存在
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

使用Memcache来缓存:

Memcached 是目前 Django 可用的最快的缓存,

但是memcache需要你的服务器支持,也就是说需要有Memcache服务,

Linux系统安装Memcached,首先要先安装libevent库。

$ yum -y install libevent ibevent-devel         联网自动下载安装

$ yum -y install install memcached		linux安装memcached 的方法我就不说了,自己去找去

然后需要pip3安装Memcached的插件Python-mencached 和 pylibmc

$ pip3 install Python-mencached
$ pip3 install pylibmc

最后在setting.py配置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

使用Local-memory来缓存:

这种缓存方式会将数据保存在服务器的内存中。

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
        'TIMEOUT': 600,
        'OPTIONS': {
            'MAX_ENTRIES': 2000
        }
    }
}

最推荐的缓存方式是Memcache或者Local-memory,要不就是文件缓存

Django使用Redis作为缓存

redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,

安装该数据库是为了做服务器缓存。以下两种情况都适合使用服务器缓存:

1)数据非经常更新。若每次都从硬盘读取一次,浪费服务器资源、拖慢响应速度。

2)数据更新频率较高,服务器负担比较大。

这些数据只需每天更新一次。而我每次都从数据库获取相应的数据,计算统计排行情况和阅读数。很明显浪费服务器资源,浪费时间。解决方法是定时统计一次数据,保存到数据库或文件中。每次读取数据从中获取。

若保存到数据库,还需要额外建立一张对应的表存储数据。在Django中建立表通常做法是建立一个模型。看似简单,问题调试麻烦、开发时长久。所以我一直拖着没处理该问题。毕竟一开始访问量不是很多。后来不少网友访客打开慢(当然服务器在国外也是个原因),查了资料发现Redis内存数据库。可以将数据写入到内存,再进行读写。减少计算量,可以有效提高服务器响应速度。

这么一来,我就不用创建新表创建模型。直接将数据写入缓存,定时更新。获取数据从服务器缓存获取即可。

下面我就来介绍如何在Django中配置使用redis数据库!

安装django-redis

pip3 install django-redis

settings配置

# redis 缓存数据库配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://192.168.32.130:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "DECODE_RESPONSES":True,
            "PASSWORD": "root",
        }
    }
}

views视图中使用redis

# 视图中使用redis缓存数据库
from django_redis import get_redis_connection
conn = get_redis_connection('default')

全站缓存

在django中的settings配置文件中设置

'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',

单视图缓存

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def cache(request):
    # return HttpResponse('hello')		# 当我们第一次访问的时候,redis中已经存在了一个hello的值,当我们发送的数据发生改变的时候,这时候因为过期时间还没到,不会清除缓存的信息。
    return HttpResponse('hellodsafnjsakfaskfg')		

在页面中局部进行缓存

  • 使用cache模板标签来缓存模板的一个片段
  • 需要两个参数:
    • 缓存时间,以秒为单位
    • 给缓存片段起的名称
步骤I. 引入TemplateTag
        {% load cache %}
步骤II. 使用缓存
        {% cache 5000 缓存key %}		缓存时间 5000秒
            缓存内容
        {% endcache %}

底层的缓存API

from django.core.cache import cache

设置:cache.set(键,值,有效时间)
获取:cache.get(键)
删除:cache.delete(键)
清空:cache.clear()
posted @ 2019-12-01 15:52  GeminiMp  阅读(1271)  评论(0编辑  收藏  举报