5

我需要一个临时的内存键值存储。我知道有像 Redis 这样的解决方案。但我想知道使用 python 字典是否可行?并且可能更快?所以想想 Tornado(或类似的)服务器运行并在内存中保存一个 python 字典,并根据 HTTP 请求返回适当的值。

为什么我需要这个?作为服务的一部分,存储了一些键值,但它们具有以下属性:它们越新,就越有可能被访问。所以我想在内存中保留最后 100 个键值(以及写入磁盘)以便更快地检索。

如果服务器死了,字典可以从磁盘再次恢复。

有没有人做过这样的事情?我在这里完全错过了什么吗?

PS:我认为使用 WSGI 服务器是不可能的,对吧?因为据我所知,您无法在单个请求之间保留某些内容。

4

6 回答 6

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')

不要关心网络延迟,因为这种优化会浪费您的时间。

于 2012-03-21T08:28:34.907 回答
3

进程中的 Python 字典memcached 服务器快得多。根据我几天前执行的非严格基准测试,使用进程中的 python 字典执行一次获取大约需要 2us,使用侦听 localhost 的 memcached 服务器大约需要 50us。在我的基准测试中,我使用 libmemcached 作为 C 客户端,使用 python-libmemcached 作为这个 C 客户端的 python 包装器。

于 2013-01-17T11:43:12.020 回答
1

如果您将字典捆绑到运行实际服务的同一台服务器中,那么是的,这会很好。


如果您要创建单独的东西,那么这基本上就是memcached目的。不要重新发明轮子。

于 2012-03-21T07:41:49.027 回答
1

我正在尝试类似的东西,corecache 库是测试一些缓存系统的好方法。 https://pypi.python.org/pypi/cachecore

特别是,他们的 SimpleCache 实现依赖于 vanilla python dict,在我的初步测试中,它非常快,比在本地调用 memcached 快 10 倍(假设我已经在需要缓存的 python 应用程序中,在你的情况下可能是龙卷风服务) .

于 2013-07-11T13:41:36.683 回答
0

这是可能的,而且由于没有网络延迟,它比 redis/memcache 快得多。您可以每隔一段时间使用 cPickle 转储字典。虽然如果您的程序产生子进程,那么更新一个进程中的值不会影响另一个进程,这很棘手。

于 2012-03-21T07:43:19.170 回答
0
  1. 您可以只在 dict 中缓存最后的数据,没有人禁止它,它可以在单服务器环境中工作
  2. 添加新数据时 - 将其存储到某个 redis (memcachedb)
  3. 当服务器重新启动时 - 只需将最新的 N 条记录加载到字典中

一切都取决于数据量。我相信在 python 中将复杂结构保存在字典中需要更多内存,认为访问会很快 - 是的

于 2012-03-23T09:30:14.287 回答