使用python字典作为临时内存键值数据库?
我需要一个临时的内存键值存储。我知道有像Redis这样的解决方案。但我想知道使用python字典是否可行?而且可能更快? 因此,假设一个Tornado(或类似的)服务器在内存中运行并保存一个python字典,然后根据HTTP请求返回适当的值 为什么我需要这个? 作为服务的一部分,会存储一些键值,但它们具有以下属性:越是最近的键值越有可能被访问。所以我想把最后100个键值保存在内存中(以及写入磁盘),以便更快地检索 如果服务器死机,字典可以从磁盘上再次恢复 有人做过这样的事吗?我完全错过了什么吗使用python字典作为临时内存键值数据库?,python,caching,key-value-store,Python,Caching,Key Value Store,我需要一个临时的内存键值存储。我知道有像Redis这样的解决方案。但我想知道使用python字典是否可行?而且可能更快? 因此,假设一个Tornado(或类似的)服务器在内存中运行并保存一个python字典,然后根据HTTP请求返回适当的值 为什么我需要这个? 作为服务的一部分,会存储一些键值,但它们具有以下属性:越是最近的键值越有可能被访问。所以我想把最后100个键值保存在内存中(以及写入磁盘),以便更快地检索 如果服务器死机,字典可以从磁盘上再次恢复 有人做过这样的事吗?我完全错过了什么吗
PS:我认为使用WSGI服务器是不可能的,对吗?因为据我所知,您无法在单个请求之间保留某些内容。如果您将词典绑定到运行实际服务的同一台服务器中,那么是的,这将很好
如果您要创建单独的东西,那么这就是
memcached
的基本用途 这是可能的,而且它比redis/memcache快得多,因为没有网络延迟。您可以使用cPickle每隔一段时间转储一次字典。但是,如果您的程序生成子进程,那么更新一个进程中的值不会影响另一个进程,这很棘手。我肯定会使用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')
不要关心网络延迟,因为这种优化会浪费您的时间
这一切都取决于数据量。我相信在python的字典中保存复杂的结构需要更多的内存,虽然访问速度会很快-是的,进程中的python字典比memcached服务器快得多。根据我几天前执行的一个不严格的基准测试,使用进程内python字典执行一个get大约需要2个小时,使用本地主机上侦听的memcached服务器执行一个get大约需要50个小时。在我的基准测试中,我使用libmemcached作为C客户机,使用python libmemcached作为C客户机上的python包装器 我正在试验类似的东西,corecache库是测试一些缓存系统的好方法。
特别是,他们的SimpleCache实现依赖于一个普通的python dict,在我的初步测试中,它非常快,比在本地调用memcached快10倍(假设我已经在需要缓存的python应用程序中,可能是您的tornado服务).鉴于OP指的是Tornado服务器代理请求到dict。。。仍然会有网络延迟。@amber,但不是memcache/redis。OP的建议似乎是通过tornado重新实现memcache/redis。它仍然比使用torando作为memcache的代理要快……谁说过使用tornado作为memcache的代理?关键是根本不用龙卷风。(不过,这完全取决于OP的意思。)