使用python字典作为临时内存键值数据库?

使用python字典作为临时内存键值数据库?,python,caching,key-value-store,Python,Caching,Key Value Store,我需要一个临时的内存键值存储。我知道有像Redis这样的解决方案。但我想知道使用python字典是否可行?而且可能更快? 因此,假设一个Tornado(或类似的)服务器在内存中运行并保存一个python字典,然后根据HTTP请求返回适当的值 为什么我需要这个? 作为服务的一部分,会存储一些键值,但它们具有以下属性:越是最近的键值越有可能被访问。所以我想把最后100个键值保存在内存中(以及写入磁盘),以便更快地检索 如果服务器死机,字典可以从磁盘上再次恢复 有人做过这样的事吗?我完全错过了什么吗

我需要一个临时的内存键值存储。我知道有像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')
不要关心网络延迟,因为这种优化会浪费您的时间

  • 您可以只缓存dict中的最后一个数据,没有人禁止它,它在一个服务器环境中工作
  • 添加新数据时—将其存储到某些redis(memcachedb)
  • 当服务器重新启动时,只需将最新的N条记录加载到字典中即可

  • 这一切都取决于数据量。我相信在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的意思。)