暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

drf|缓存

零点小思随笔 2021-06-24
252

Django 建立的是动态网站,一般情况,每个请求都会经过这样一个过程:实际开发中会遇到热点数据出现大量实质相同的请求,假如每次请求都要经过上面的过程,将会出现大量重复的请求,这不仅对用户体验不好,而且对数据库的读写压力会非常大,容易把数据库干死掉。

那么怎么解决这个问题呢?方法很多,比如缓存。

缓存的思路是:已经处理过一次并得到结果,就把这个结果存储起来,再有请求时,优先从缓存中取结果返回。

可见,缓存对于一个高性能、追求用户体验的网站来说是多么重要。

Django 中的缓存系统

1、Memcached

Memcached 是 Django 原生支持的缓存系统,速度快,效率高,它是一种基于内存的缓存服务。

在 settings 文件中设置,

CACHES = {
    'default': {
        'BACKEND''django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION''127.0.0.1:11211',
    }
}

Memcached 支持分布式服务,可以同时在几台机器上运行,只要将 IP 加入到 LOCATION 中。

CACHES = {
    'default': {
        'BACKEND''django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11212',
            '172.19.26.244:11213',
        ]
    }
}

基于内存的缓存系统容易丢失数据。

2、数据库缓存

开篇介绍的时候就说过,俺们使用缓存的目的就是减轻数据库的读写压力,如果缓存也用数据库,有点不合适。不合适归不合适,人家支持了就了解下。

CACHES = {
    'default': {
        'BACKEND''django.core.cache.backends.db.DatabaseCache',
        'LOCATION''my_cache_table',
    }
}

  • LOCATION 为 tablename(缓存表的名称)

在使用数据库缓存之前,必须使用以下命令创建缓存表:

python manage.py createcachetable

  • 该命令会在数据库中创建一个表,该表的格式与 Django 的数据库缓存系统期望的格式相同。
  • 该表的名称取自 LOCATION。
  • 如果使用多个数据库缓存,则要为每个数据库都创建缓存表。
  • 如果使用多个数据库缓存,createcachetable 遵循 allow_migrate()数据库路由器的方法。

3、文件缓存

文件缓存比数据库缓存慢。

CACHES = {
    'default': {
        'BACKEND''django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION''/var/tmp/django_cache',
    }
}

4、本地缓存

如果你本地主机内存够大够快,也可以直接使用它作为缓存,并且这也是 Django 默认使用的缓存系统。

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

LOCATION 被用于标识各个内存存储位置。如果只有一个 locmem 缓存,你可以忽略 LOCATION 。但是如果你有多个本地内存缓存,那么你至少要为其中一个起个名字,以便将它们区分开。

注意,每个进程将有它们自己的私有缓存实例,这意味着不存在跨进程的缓存。这也意味着本地内存缓存不是特别节省内存,因此它不适合生产环境,不过它在开发环境中表现很好。

5、虚拟缓存(用于开发)

当你的生产环境是个大型的缓存系统,而你在开发的时候又没有相应的缓存系统支持,或者不想用那种笨重的第三方组件进行开发。但实际开发过程中,你又不得不接入缓存系统,这种情况下,开发用的缓存就很顺手了。

CACHES = {
    'default': {
        'BACKEND''django.core.cache.backends.dummy.DummyCache',
    }
}

6、自定义缓存

实际开发中,用的最多的就是使用 drf 的扩展包 drf-extensions + redis 来实现。

在虚拟环境中安装:

pip install drf-extensions
pip install django-redis

settings 文件配置:

# drf缓存过期时间设置
REST_FRAMEWORK_EXTENSIONS = {
    'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60
}
# 配置redis 缓存
CACHES = {
    "default": {
        "BACKEND""django_redis.cache.RedisCache",
        "LOCATION""redis://:password@127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS""django_redis.client.DefaultClient",
        }
    }
}

如果你使用的 Django 版本是 3.0 以上,需要修改以下这个文件:

# 文件位置
D:\Envs\example_project\Lib\site-packages\rest_framework_extensions\key_constructor\bits.py

  • D:\Envs\example_project 为你自己项目的虚拟环境。

打开文件,做如下修改:

from django.db.models.sql.datastructures import EmptyResultSet

改为

from django.core.exceptions import EmptyResultSet

drf-extensions 对缓存提供了3个扩展类:

from rest_framework_extensions.cache.mixins import CacheResponseMixin, ListCacheResponseMixin, RetrieveCacheResponseMixin

  • CacheResponseMixin:支持 List 和 Retrieve 两种缓存,与 ListModelMixin 和 RetrieveModelMixin 一起配合使用
  • ListCacheResponseMixin:用于缓存 List 的视图数据,与 ListModelMixin 配合使用。
  • RetrieveCacheResponseMixin:用于缓存返回单一数据的视图,与 RetrieveModelMixin 配合使用。


文章转载自零点小思随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论