首页 > 解决方案 > Django,缓存端点是什么意思?

问题描述

使用 DRF 或普通视图,我使用这样的东西。

@method_decorator(cache_page(60))
def list(self, request, *args, **kwargs):

缓存是如何工作的?

当用户 a 请求它时,它会缓存 60 秒。
当用户 b 请求同一个端点时,它返回缓存的响应

60 秒后,缓存过期纯粹是因为时间已经过去。(这 60 秒内发生了什么并不重要)

当另一个用户请求相同的终点时,60 秒的周期开始了吗?

标签: djangodjango-rest-framework

解决方案


基本来说,cache_page是一个可以缓存视图响应的装饰器。所以,

当另一个用户请求相同的终点时,60 秒的周期开始了吗?

是的。View 将在 60 秒内为任何请求返回缓存响应。

假设我们有一个类似/api/foo/使用的视图,cache_page并且我们向该视图发出 get 请求。在请求之前;

In [1]: cache.keys("*")
Out[1]: []

我们没有任何缓存值。先执行获取请求,然后执行;

In [2]: cache.keys("*")
Out[2]: 
['views.decorators.cache.cache_header..883916f71c4da1b141ca1ff4dc7019a5.en.Europe/Istanbul',
 'views.decorators.cache.cache_page..GET.883916f71c4da1b141ca1ff4dc7019a5.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul']

我们已经缓存了响应。在第一次请求之后,所有请求都会在 60 秒内得到相同的响应。

但是,我不建议使用该装饰器进行缓存。因为,即使您不使用查询参数,它也会为任何请求存储新的缓存值,例如:/api/foo/?a=1, /api/foo/?x=y,/api/foo/?asdasd

In [7]: cache.keys("*")
Out[7]: 
['views.decorators.cache.cache_header..883916f71c4da1b141ca1ff4dc7019a5.en.Europe/Istanbul',
 'views.decorators.cache.cache_header..e9c29669e862c476759c45b12ada4cbc.en.Europe/Istanbul',
 'views.decorators.cache.cache_page..GET.0ab7d958193472928e5601220fd320a2.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul',
 'views.decorators.cache.cache_header..46a68ec3d6f1ab223d7b2dd5916f2de3.en.Europe/Istanbul',
 'views.decorators.cache.cache_header..0ab7d958193472928e5601220fd320a2.en.Europe/Istanbul',
 'views.decorators.cache.cache_page..GET.e9c29669e862c476759c45b12ada4cbc.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul',
 'views.decorators.cache.cache_page..GET.46a68ec3d6f1ab223d7b2dd5916f2de3.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul',
 'views.decorators.cache.cache_page..GET.883916f71c4da1b141ca1ff4dc7019a5.05ef8c85ad5bfa657724f2753311c056.en.Europe/Istanbul']

因此,缓存您的方法而不是使用cache_page. 例如;

class MyService:
    def _read_from_cache(self, key):
        return cache.get(key)

    def _write_to_cache(self, key, value, ttl=60 * 1):
        cache.set(key, value, ttl)
        
    def my_method(self):
        cache_key = "my_cache_key"
        cache_value = self._read_from_cache(key=cache_key)
        if cache_value:
            return cache_value
        context = {"hello": "world"}
        self._write_to_cache(key=cache_key, value=context)
        return context

和在views.py;

def list(self, request, *args, **kwargs):
    service = MyService()
    context = service.my_method()
    return Response(context)

推荐阅读