DRF 缓存

应用环境 django4.2.3 ,python3.10

由于对于服务而言,有些数据查询起来比较费时,所以,对于有些数据,我们需要将其缓存。

最近做了一个服务,用的时 DRF 的架构,刚好涉及缓存,特此记录。

DRF的缓存,和django自带的缓存有个比较大的区别:django自带的缓存,一旦将数据缓存,那么数据源一旦发生变化,那么我们从缓存中取到的内容,就是老的内容,并不是最新的内容。但是 DRF 的缓存,却是会自动更新的,比如,已经缓存了数据库的一些数据,这时,数据库的这些数据被更新了,那么,DRF 也将会对已经缓存了的数据自动进行更新。

然后,看下大致的用法:

先下载包:

复制代码
pip3 install drf-extensions
python 复制代码
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from machines.models import Repository
from rest_framework_extensions.cache.decorators import cache_response
from machines.api.serializers import RepositorySerializers


class RepoInfoViewSet(GenericAPIView):
    queryset = Repository.objects.all()
    serializer_class = RepositorySerializers

    def _get_repositories(self, state, servicename, service_port):
       
        base = Repository.objects
        return Response(self.get_serializer(instance=base.all(),many=True).data)

    @staticmethod
    def set_cache_key(request, *args, **kwargs):
        return request.path

    @cache_response(timeout=300, cache='default', key_func='set_cache_key')
    def get(self, request, state=None, servicename=None, service_port=None):
        return self._get_repositories(state, servicename, service_port)

大概说下,cache_response 方法就可以直接搞缓存,它里面那几个参数,

timeout:指缓存的过期时间。

cache:指在要用的缓存对象,它的值,就是在 settings.py 中 CACHES 参数中的配置的 key。

key_func:这里涉及一个问题,通常情况下,缓存的时候都是这么干的:cache.set("key", "value", 60) , 就是说,缓存对象,存一个key,以及要缓存的内容value,和缓存的过期时间。那么,一般来说,这个key,是不需要我们直接提供的,django会自动分配一个独一无二的key给它,在 DRF中,用的是这个对象:

它将为要缓存的对象,构建一个独一无二的key,之所以介绍这么一个东西,是因为,这个key,将涉及清除缓存的问题,如果是清除所有缓存,那就无所谓,不存在问题,直接 clear() 完事,但是如果涉及定点清除,那么问题就来了,我们根本就不知道我们要清除的数据它的key是多少,那么就没法清除具体的某个缓存了。所以,这个时候,就需要用到 key_func 这个参数,我们需要构建一个制作key的函数,让其返回一个字符串,来成为我们要缓存对象的key,这样以来,我们就知道了缓存对象的key,后续如果需要清除掉这个缓存就可以直接 cache.delete(key) 来清除它了。

我的这个示例中自己构造了set_cache_key函数来制作我需要的缓存key,它的执行结果是这样的:

先访问一次服务,让其产生缓存

然后,访问清除缓存动作:

对了,补充一句,这块用的cache是从这来的:from django.core.cache import cache

可以看到,缓存对象的 key 确实就是我自己定义的 request.path。

当然,我这里用的依旧是cache.clear(),因为我这里的业务逻辑,只有一处缓存,那么清除的话,一把全清也不影响,但是,如果客户要求清除某些特定的缓存的话那就可以使用 cache.delete()方法了,比如:

连着弄两次,第二次就会出问题,因为第一次就已经删除了key,自然就没有这个缓存了,再删就会失败。

另外,看一个文件缓存的配置:

python 复制代码
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/tmp/django_cache',
        'TIMEOUT': 60,
        'OPTIONS': {'MAX_ENTRIES': 1000}
    }
}

settings.py中可以有其他的缓存配置,比如使用redis....

相关推荐
刘~浪地球1 小时前
Redis 从入门到精通(一):简介、安装与配置
数据库·redis·缓存
刘~浪地球3 小时前
Redis 从入门到精通(二):数据类型详解
数据库·redis·缓存
会飞的大可6 小时前
Redis 竞品与替代方案选型可行性分析报告
数据库·redis·缓存
_深海凉_9 小时前
LeetCode热题100-LRU 缓存
算法·leetcode·缓存
難釋懷9 小时前
Redis缓存预热
redis·spring·缓存
会飞的大可11 小时前
Redis 故障排查与应急手册:从理论到实践
数据库·redis·缓存
独断万古他化12 小时前
抽奖系统性能负载测试:基于 JMeter 的梯度加压与本地缓存优化全流程
java·redis·jmeter·缓存·压力测试·测试·负载测试
rrrjqy12 小时前
Redis常见问题(一)
数据库·redis·缓存
hero.fei12 小时前
排查redis出现报错ERR redis temporary failure
数据库·redis·缓存
福大大架构师每日一题12 小时前
ollama v0.19.0 发布!Web 搜索插件上线、多模型兼容修复、MLX 与 KV 缓存全面优化,本地大模型体验再升级
缓存·ollama