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

时间:2012-03-21 07:39:11

标签: python caching key-value-store

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

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

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

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

PS:我认为使用WSGI服务器是不可能的,对吧?因为据我所知,你不能在个别请求之间保留内存。

6 个答案:

答案 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)

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


如果您正在创建单独的内容,那么这基本上就是memcached的内容。 Don't reinvent the wheel.

答案 4 :(得分:0)

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

答案 5 :(得分:0)

  1. 你可以只在dict中缓存最后一个数据,没有人禁止它,它可以在一个服务器环境中工作
  2. 添加新数据时 - 将其存储到某些redis(memcachedb)
  3. 当服务器重新启动时 - 只需将最新的N条记录加载到字典
  4. 全部取决于数据量。我相信在python中将复杂结构保存在字典中需要更多内存,以为访问速度很快 - 是的