目录
首发于:
最近更新于:
分类: posts

简介

diaskcache模块解决了一个什么问题,其提供了一种本地文件式存储的缓存解决方案。当然也不一定局限在缓存解决方案上,一些简单的不是很重要的临时数据存储也可以利用这个模块来实现。具体其文件存储采用的sqlite数据库,而在使用上我们不需要考虑sql数据库哪一些东西,就可以将其看做一个升级版的具有不错速度的类shelve的解决方案。

diskcache很好用,而且速度还挺快的。项目Github地址在 这里 。虽然项目星数不是特别多,但从个人使用体验来说,基本上满足了个人的需求了。比如速度快,和python各个数据类型对接方便,更复杂的数据类型没有试过,也没必要,就一般的python数据类型来说,比如列表,字典,字符串之类的,基本上是无缝对接。然后一般缓存需要的过期时间功能它也是有的,所以基本上是一个不错的模块了。

具体使用很方便和简单,建议简单看下官方tutorial 即可,下面也简单说明一下。

基本使用

首先是建立一个cache对象:

from diskcache import Cache
cache = Cache(cache_path)

这个cache对象是线程安全的,上面cache_path就是你想要的缓存存放所在地。

比如windows一般软件数据放在:

user_data_path = os.path.expanduser(os.path.join('~', 'AppData', 'Roaming', APP_NAME))

if not os.path.exists(user_data_path):
    os.mkdir(user_data_path)

cache_path = os.path.join(user_data_path, 'cache')

cache对象的使用如下所示:

def set_cache(key, value):
    """
    过期时间 10天
    :param key:
    :param value:
    :return:
    """
    cache.set(key, value, expire=864000)

def get_cache(key):
    return cache.get(key)

虽然推荐使用 cache.close() 方法,但是并不推荐精确到程序元操作级别,get会自动的open cache,但频繁的open开销太大了。一般推荐将这个cache作成更全局的变量,程序结束的时候可以考虑执行 cache.close 方法。如果是单线程单进程操作,甚至不调用close也问题不大。但是如果程序是多线程式的,那么就一定要保证及时的close或者如下使用 with 语句:

>>> with Cache(cache.directory) as reference:
...     reference.set('key', 'value')

如上所示cache的数据也是可以加上过期时间的,即 expire 参数,单位是秒。

diskcache还提供了其他功能和类等,就简单的使用介绍就是上面这些了。