写入Django缓存

时间:2016-02-12 15:15:34

标签: django caching django-cache

我曾经在全局变量中缓存数据库查询以加速我的应用程序。由于这是强烈的未经修改(它确实产生了问题),我想使用任何类型的Django缓存。我尝试了LocMemCache和DatabaseCache,但两者都需要......大约 15秒来设置我的变量(比生成数据需要的时间长两倍,大小为7MB)。

这是预期的吗?我做错了吗?

(Memcached限制为1MB,我无法拆分我的数据,其中包含任意大的二进制掩码)。

编辑:FileBasedCache也需要30秒才能设置。

Settings.py:

CACHES = {
    'default': {...},
    'stats': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 
        # or 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'stats',
    },
}

Service.py:

from django.core.cache import caches

def stats_service():
    stats_cache = caches['stats']
    if stats_cache.get('key') is None:
        stats_cache.set('key', data)  # 15s with DatabaseCache, 30s with LocMemCache
    return stats_cache.get('key')

全局变量(超快)版本:

_cache = {}

def stats_service():
    if _cache.get('key') is None:
        _cache['key'] = data
    return _cache['key']

2 个答案:

答案 0 :(得分:2)

一种选择可能是使用diskcache.DjangoCacheDiskCache扩展了Django缓存API,以支持按原样写入和读取二进制流(避免酸洗)。它对于大值(例如大于1MB的值)特别有效。 DiskCache是​​一个Apache2许可磁盘和file backed cache library,用纯Python编写,与Django兼容。

在您的情况下,您可以使用ndarray tostring和numpy fromstring方法快速转换为Python字符串/从Python字符串转换。然后用io.StringIO包装字符串以在缓存中存储/检索。例如:

from django.core.cache import cache

value = cache.get('cache-key', read=True)

if value:
    data = numpy.fromstring(value.read())
    value.close()
else:
    data = ... # Generate 7MB array.
    cachge.set('cache-key', io.StringIO(data.tostring()), read=True)

DiskCache通过允许类似文件的值扩展Django缓存API,这些值作为二进制blob存储在磁盘上。 Django cache benchmarks页面讨论并比较了备用缓存后端。

答案 1 :(得分:0)

此代码段实际上运行正常:https://djangosnippets.org/snippets/2396/

据我所知,使用全局变量进行缓存的the only problem是线程安全的,这个no-pickle版本是线程安全的。