【问题标题】:In Django, how can we get all cache keys stored in database (MySQL)在 Django 中,我们如何获取存储在数据库中的所有缓存键(MySQL)
【发布时间】:2018-03-09 07:28:06
【问题描述】:

我在 Django 中使用per-view cache,我想在缓存过时时刷新缓存。在文档中,我没有看到有关刷新陈旧缓存的信息,在经历了几个线程后,我决定使用 django-signals 向函数发送信号,该函数将从数据库中删除缓存记录。所以我的问题是我们如何检索密钥并删除它?

我看到默认实现提供了一种为缓存提供过期时间的方法(如在@cache_page(60 * 15) 中,并且每当我们在过期时间后调用视图时它都会刷新。有没有办法刷新陈旧的缓存而不是基于在预定时间?

【问题讨论】:

    标签: python django caching


    【解决方案1】:

    我在这里找到了一些解决方案 (Expire a view-cache in Django?)。它主要与memcached数据有关,但我的是数据库缓存数据。

    我想出了 Django 信号来调用一个函数来清除与我的视图相关的所有缓存。由于在数据库缓存数据中检索键不是一件简单的事情,我只是通过原始 SQL 来删除视图缓存。下面是代码sn-p。

    注意:由于我只有一个缓存视图,我只是将其删除,但如果缓存表中有多个每个视图缓存,则在删除缓存数据时需要小心

    cache_table 是在 settings.py 中为缓存表定义的名称

    CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',
    }}
    
    
    
    @receiver(post_save, sender=SampleModel)
    def remove_cache(instance, **kwargs):
    with connection.cursor() as cursor:
        cursor.execute("DELETE FROM cache_table where cache_key like ('%views.decorators.cache%')")
        print('Deleted view cache')
    

    【讨论】:

      【解决方案2】:

      另一种方法是创建自己的缓存并使用django low-level cache API 创建自己的密钥。这很简单,让您可以更好地控制缓存数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 2014-08-22
        • 1970-01-01
        相关资源
        最近更新 更多