【问题标题】:Using python dictionary as a temporary in-memory key-value database?使用 python 字典作为临时内存键值数据库?
【发布时间】:2012-03-21 07:39:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python caching key-value-store


    【解决方案1】:

    我肯定会使用 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')
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果您将字典捆绑到运行实际服务的同一台服务器中,那么可以,这样可以正常工作。


        如果您要创建单独的东西,那么这基本上就是 memcached 的用途。 Don't reinvent the wheel.

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 鉴于 OP 指的是 Tornado 服务器代理对 dict 的请求......仍然会有网络延迟。
            • @amber 但不是 memcache/redis。
            • OP 似乎建议的是通过龙卷风重新实现 memcache/redis。
            • 它仍然比使用 torando 作为 memcache 的代理要快。
            • ...谁说过使用 tornado 作为 memcache 的代理?关键是根本不使用龙卷风。 (不过,这一切都取决于 OP 的意思。)
            【解决方案6】:
            1. 你可以只在 dict 中缓存最后的数据,没有人禁止它,它可以在单服务器环境中工作
            2. 添加新数据时 - 将其存储到某个 redis (memcachedb)
            3. 服务器重新启动时 - 只需将最新的 N 条记录加载到字典中

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-27
              • 2016-11-14
              • 1970-01-01
              • 1970-01-01
              • 2021-12-12
              相关资源
              最近更新 更多