有 Python 缓存库吗?

我正在寻找一个 Python 缓存库,但是到目前为止还没有找到任何东西。我需要一个简单的 dict-样的界面,我可以设置键和他们的过期日期,并得到他们回缓存。有点像:

cache.get(myfunction, duration=300)

如果该项存在,它将从缓存中提供该项; 如果该项不存在或已过期,则调用该函数并存储该项。有人知道这种事吗?

136962 次浏览

我认为 Python memcached API是流行的工具,但我自己还没有使用它,也不确定它是否支持您需要的特性。

import time


class CachedItem(object):
def __init__(self, key, value, duration=60):
self.key = key
self.value = value
self.duration = duration
self.timeStamp = time.time()


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


class CachedDict(dict):


def get(self, key, fn, duration):
if key not in self \
or self[key].timeStamp + self[key].duration < time.time():
print 'adding new value'
o = fn(key)
self[key] = CachedItem(key, o, duration)
else:
print 'loading from cache'


return self[key].value






if __name__ == '__main__':


fn = lambda key: 'value of %s  is None' % key


ci = CachedItem('a', 12)
print ci
cd = CachedDict()
print cd.get('a', fn, 5)
time.sleep(2)
print cd.get('a', fn, 6)
print cd.get('b', fn, 6)
time.sleep(2)
print cd.get('a', fn, 7)
print cd.get('b', fn, 7)

您还可以看一下 记住装潢师。你也许可以让它做你想做的,而不需要太多的修改。

看看皮皮上的 Gocept.cache管理暂停。

查看 bda.cache http://pypi.python.org/pypi/bda.cache-使用 ZCA 并使用 zope 和 bfg 进行测试。

尝试 Redis,它是应用程序以原子方式共享数据的最干净和最简单的解决方案之一,如果你有一些 Web 服务器平台的话。它非常容易设置,您将需要一个 python redis 客户端 http://pypi.python.org/pypi/redis

你可以用我的简单解决方案来解决这个问题,它很简单,没什么花哨的:

class MemCache(dict):
def __init__(self, fn):
dict.__init__(self)
self.__fn = fn


def __getitem__(self, item):
if item not in self:
dict.__setitem__(self, item, self.__fn(item))
return dict.__getitem__(self, item)


mc = MemCache(lambda x: x*x)


for x in xrange(10):
print mc[x]


for x in xrange(10):
print mc[x]

它确实缺乏过期功能,但是您可以通过在 MemCache c-tor 中指定特定的规则轻松地扩展它。

Hope 代码已经足够自我解释了,但是如果没有的话,仅仅是提一下,缓存正在作为其 c-tor 参数之一传递一个转换函数。它依次用于生成与输入相关的缓存输出。

希望能有帮助

Joblib https://joblib.readthedocs.io支持 Memoize 模式中的缓存函数。

>>> from joblib import Memory
>>> mem = Memory(cachedir='/tmp/joblib')
>>> import numpy as np
>>> square = mem.cache(np.square)
>>>
>>> a = np.vander(np.arange(3)).astype(np.float)
>>> b = square(a)
________________________________________________________________________________
[Memory] Calling square...
square(array([[ 0.,  0.,  1.],
[ 1.,  1.,  1.],
[ 4.,  2.,  1.]]))
___________________________________________________________square - 0...s, 0.0min


>>> c = square(a)

您还可以对函数使用@memory. cache 装饰符

Keyring 是最好的 Python 缓存库

keyring.set_password("service","jsonkey",json_res)


json_res= keyring.get_password("service","jsonkey")


json_res= keyring.core.delete_password("service","jsonkey")

在 Python 3.2中,您可以使用 Functools 库中的 decorator @ lru _ cache。 它是一个 最近最少使用缓存,所以其中的项目没有过期时间,但作为一个快速黑客,它是非常有用的。

from functools import lru_cache


@lru_cache(maxsize=256)
def f(x):
return x*x


for x in range(20):
print f(x)
for x in range(20):
print f(x)

还没有人提到搁置

它不是 memcached,但看起来更简单,可能适合您的需要。

这个 项目旨在提供“人类缓存” (似乎是相当不为人知的)

来自项目页面的一些信息:

安装

Pip 安装缓存

用法:

import pylibmc
from cache import Cache


backend = pylibmc.Client(["127.0.0.1"])


cache = Cache(backend)


@cache("mykey")
def some_expensive_method():
sleep(10)
return 42


# writes 42 to the cache
some_expensive_method()


# reads 42 from the cache
some_expensive_method()


# re-calculates and writes 42 to the cache
some_expensive_method.refresh()


# get the cached value or throw an error
# (unless default= was passed to @cache(...))
some_expensive_method.cached()

过期指令是另一种选择:

Https://pypi.org/project/expiringdict/