繁体   English   中英

如何将 Django 查询集设置为 GKE memcached

[英]How to set Django queryset to GKE memcached

不知何故,我认为 pymemcached 应该像 django 缓存一样开箱即用。

但我意识到事实并非如此。

浏览文档,有 set_multi、get_multi 等方法。 这应该适用于 django 字典(键/值对)。

鉴于 Django 查询集不是传统的字典,那么与 pymemcached 一起使用的方法是什么。

这是目前如何使用它:

if not settings.DEBUG:
    from pymemcache.client.base import Client

    NODE_NAME = os.environ['NODE_NAME']
    client = Client((NODE_NAME, 5000))

class ProductsListCacheAPIView(ListAPIView):
    
    model = Product
    
    serializer_class = TestProductSerializer
    filter_backends= [SearchFilter, OrderingFilter]
    permission_classes = [AllowAny]
    search_fields = ['product_title', 'product_description', 'user__first_name', 'product_type', 'product_price', 'product_city']
    pagination_class = ProductPageNumberPagination
    

    def get_queryset(self, *args, **kwargs):
 
        query = self.request.GET.get("search")
        lookups = ()

        .....

            queryset_list = queryset_list.filter(lookups).distinct()

        cache_key = 'my_api_marketplace_cache' 
        data = client.get(cache_key)
        
        if data is None:
            print('Getting marketplace fresh from database!')
            data = queryset_list
            client.set(cache_key, queryset_list, cache_time)
        return data

这当然行不通。 似乎不像 django 缓存

from django.core.cache import cache (django.core.cache.backends.memcached.PyLibMCCache)

set 方法似乎只适用于 pymemcached 的字符串。

如何在此处使用 pymemcached 缓存 django 查询集?

简短的回答是,并非每个缓存都是查询缓存。 Django 缓存被优化为响应缓存(页面缓存),并以最少的配置工作以缓存完全呈现的页面。

此外,使用装饰器或正确调用缓存函数,您可以缓存可以序列化为字符串的内容,就像您发现的那样。

查询集缓存的用处很小:

  • 首先,如果不依赖于运行时数据,您可以在声明时缓存视图(DRF 和 Django 视图)的查询集。 这节省了查询集结构的构建,但不评估它
  • 其次,数据库有查询缓存,在您可以利用的 Django 的 scope 之外。
  • 第三,在极少数情况下,缓存评估的查询集是一种更好的方法,因为它可以用于呈现不同的输出。 一般来说,最终的查询集要么取决于请求上下文,要么相同的查询集生成相同的 output,所以为什么不缓存 output。

查看您的案例,您属于第 3 类:您可以简单地缓存视图并让它依赖于搜索参数。 只缓存查询集没有任何好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM