代码之家  ›  专栏  ›  技术社区  ›  middus

在django中缓存站点地图

  •  9
  • middus  · 技术社区  · 7 年前

    我使用Django的默认站点地图应用程序实现了一个简单的站点地图类。由于执行时间较长,我添加了手动缓存:

    class ShortReviewsSitemap(Sitemap):
        changefreq = "hourly"
        priority = 0.7
    
        def items(self):
            # Try to retrieve from cache
            result = get_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews")
            if result!=None:
                return result
    
            result = ShortReview.objects.all().order_by("-created_at")
    
            # Store in cache
            set_cache(CACHE_SITEMAP_SHORT_REVIEWS, "sitemap_short_reviews", result)
    
            return result
    
        def lastmod(self, obj):
            return obj.updated_at
    

    问题是 Memcached 仅允许最大1MB对象。这一个大于1MB,因此将其存储到缓存失败:

    >7 SERVER_ERROR object too large for cache
    

    问题是Django有一种自动方式来决定何时应该将站点地图文件划分为较小的文件。根据 the documentation

    如果需要,您应该创建一个索引文件 您的站点地图中有超过50000个 自动为站点地图分页, 指数将反映这一点。

    您认为启用缓存站点地图的最佳方式是什么?

    • 或者有一种方法可以让Memcached存储更大的文件?

    所有这些似乎都很低水平,我想知道是否存在一个明显的解决方案。。。

    4 回复  |  直到 5 年前
        1
  •  16
  •   Oduvan    5 年前

    50k不是硬编码参数。

    你可以使用class 相反:

    class LimitGenericSitemap(GenericSitemap):
        limit = 2000
    
        2
  •  2
  •   Simon Steinberger    10 年前

        from django.contrib.sitemaps import GenericSitemap
        from django.contrib.sitemaps.views import sitemap
        from django.utils.encoding import smart_str
        import gzip
        sitemaps = {
            'page': GenericSitemap({'queryset': MyModel.objects.all().order_by('-created'), 'date_field': 'created'}),
        }
        f = gzip.open(settings.STATIC_ROOT+'/sitemap.xml.gz', 'wb')
        f.write(smart_str(sitemap(request, sitemaps=sitemaps).render().content))
        f.close()
    

        3
  •  2
  •   user8456    5 年前

    假设您不需要站点地图中的所有页面,那么降低限制以减小文件大小将很好地工作,如前面的回答所述。

    如果您确实想要一个非常大的站点地图,并且确实想要使用Memcached,您可以将内容分成多个块,将它们存储在各个键下,然后在输出时将它们重新组合在一起。为了提高效率,Memcached支持同时获取多个密钥的功能,尽管我不确定Django客户端是否支持此功能。

    作为参考,1MB限制是Memcached的一项功能,与存储数据的方式有关: http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_(1_megabyte)

        4
  •  1
  •   gimel    5 年前

    the hack ,将站点地图限制为250个链接,并实现基于文件的缓存。

    基本算法如下:

    • 尝试从磁盘上的文件加载站点地图
    • 如果站点地图包含250个链接(上面设置的数字),请将其保存到磁盘,然后返回。

    如果您感兴趣,整个过程的代码如下: http://bitbucket.org/mlissner/legal-current-awareness/src/tip/alert/alertSystem/sitemap.py

    也许这对你来说也是个好办法。