【问题标题】:Advice in caching for pythonpython缓存中的建议
【发布时间】:2017-12-11 15:51:26
【问题描述】:

我正在使用 Flask-Restful 作为 Python API,它运行良好。 现在,我想缓存的数据库操作很少,我该怎么做?我在网上搜索过,有几个选项,例如烧瓶缓存和 CacheTools,我无法决定。

Flask 缓存主要是缓存请求而不是内部使用的数据,如果我错了,请纠正我。

Cachetools 有一些有用的方法,比如 lru_cache 等,对我有用吗?

PS:我主要是一个 Java 人,以前在我以前的服务中使用过带有 spring boot 的 guava,所以在 python 中寻找类似的东西。

【问题讨论】:

  • Flask Cache 缓存对请求的响应。 lru_cache 缓存函数的返回值,CacheTools 为您提供不同的缓存策略,您如何使用它们取决于您。我不知道 spring boot 是做什么的,但这取决于你的需求,你想要缓存的位置和内容,并且没有单一的解决方案。
  • 嗨,我基本上是想缓存数据而不是请求,因为我的请求几乎总是唯一的。

标签: java python caching flask flask-cache


【解决方案1】:

之前,我也遇到过这个问题。 最后,我使用了 Redis。

并且在werkeug 中,有一个缓存库,这使得Redis 易于使用。

from werkzeug.contrib.cache import RedisCache

有关详细信息,请参阅doc

顺便说一下,如果你的应用是单进程运行的(多线程也可以),你可以使用下面的代码。

class CachedItem:
    def __init__(self, item, duration):
        self.item = item
        self.duration = duration
        self.time_stamp = time.time()

    def __repr__(self):
        return '<CachedItem {%s} expires at: %s>' % (self.item, time.time() + self.duration)


class CachedDict(dict):
    def __init__(self, *args, **kwargs):
        super(CachedDict, self).__init__(*args, **kwargs)
        self.lock = threading.Lock()

    def get_cache(self, key, default=None, duration=300):
        with self.lock:
            self._clean()
            if key in self:
                return self[key].item
            else:
                self[key] = CachedItem(default, duration)
            return self[key].item

    def set_cache(self, key, value, duration=300):
        with self.lock:
            self[key] = CachedItem(value, duration)

    def _clean(self):
        for key in list(self.keys()): # [self.keys()] error, we get dict_keys type
            if self[key].time_stamp + self[key].duration <= time.time():
                self.pop(key)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2011-07-07
    • 2011-03-16
    • 2012-06-17
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多