我需要一些临时的内存中键值存储。我知道有像Redis这样的解决方案。但我想知道使用python字典是否可行?可能更快? 因此,想想一个Tornado(或类似的)服务器在内存中运行并保存python字典,并根据HTTP请求返回适当的值。
为什么我需要这个? 作为服务的一部分,存储了关键值,但它们具有此属性:它们越新,它们就越有可能被访问。所以我想在内存中保留最后100个键值(以及写入磁盘)以便更快地检索。
如果服务器死了,可以从磁盘再次恢复字典。
有人做过这样的事吗?我在这里完全错过了什么吗?
PS:我认为使用WSGI服务器是不可能的,对吧?因为据我所知,你不能在个别请求之间保留内存。
答案 0 :(得分:4)
我肯定会使用memcached。一旦设置完毕,您可以轻松地修饰您的功能/方法,就像我在我的示例中所做的那样:
#!/usr/bin/env python
import time
import memcache
import hashlib
def memoize(f):
def newfn(*args, **kwargs):
mc = memcache.Client(['127.0.0.1:11211'], debug=0)
# generate md5 out of args and function
m = hashlib.md5()
margs = [x.__repr__() for x in args]
mkwargs = [x.__repr__() for x in kwargs.values()]
map(m.update, margs + mkwargs)
m.update(f.__name__)
m.update(f.__class__.__name__)
key = m.hexdigest()
value = mc.get(key)
if value:
return value
else:
value = f(*args, **kwargs)
mc.set(key, value, 60)
return value
return f(*args)
return newfn
@memoize
def expensive_function(x):
time.sleep(5)
return x
if __name__ == '__main__':
print expensive_function('abc')
print expensive_function('abc')
不关心网络延迟,因为这种优化会浪费你的时间。
答案 1 :(得分:3)
正在进行的Python字典方式比memcached服务器更快。根据我几天前执行的一个非严格的基准测试,单个get使用进程python字典大约需要2us,使用监听localhost的memcached服务器大约50us。在我的基准测试中,我使用libmemcached作为C客户端,python-libmemcached作为python包装器使用此C客户端。
答案 2 :(得分:1)
我正在尝试类似的东西,而corecache库是测试一些缓存系统的好方法。 https://pypi.python.org/pypi/cachecore
特别是,他们的SimpleCache实现依赖于一个vanilla python dict,在我的初步测试中它非常快,比在本地调用memcached快10倍(假设我已经在需要缓存的python应用程序中,可能是龙卷风服务你的情况)。
答案 3 :(得分:0)
答案 4 :(得分:0)
这是可能的,它比redis / memcache快得多,因为没有网络延迟。您可以使用cPickle每隔一段时间转储字典。但是如果你的程序产生子进程,那么在一个进程中更新值不会影响另一个进程,这很棘手。
答案 5 :(得分:0)
全部取决于数据量。我相信在python中将复杂结构保存在字典中需要更多内存,以为访问速度很快 - 是的