Cacheout

3,080 阅读3分钟

python的缓存库(cacheout)

项目: github.com/dgilland/ca…

文档地址: cacheout.readthedocs.io

PyPI(下载链接): pypi.python.org/pypi/cacheo…

TravisCI(下载链接): travis-ci.org/dgilland/ca…

特性:

后端使用字典进行缓存

使用缓存管理轻松访问多个缓存对象

当使用模块级缓存对象,重构运行时的缓存设置

最大缓存大小限制

默认的缓存时间设置以及缓存项自定义存活时间

批量的设置、获取、删除操作

线程安全

安装:pip install cacheout
缓存:cacheout
缓存模块提供Cache用作其他缓存类型的基础的类

简单实现以及参数解析

class cacheout.cache.Cache(maxsize=None, ttl=None, timer=None, 默认=None)
内存中的FIFO(先进先出)缓存对象,支持:
1、最大缓存条目数
2、全局TTL默认
3、每个缓存条目TTL
4、TTL第一/非TTL FIFO缓存驱逐策略 以秒单位

多种缓存机制的实现

FIFO(先进先出):从驱逐队列开头开始驱逐缓存条目
LIFO(后进先出):从驱逐队列末尾开始驱逐缓存条目
LRU(最近最少使用):使用最近最少使用的驱逐政策,调用get()并set()调用时,缓存条目被移动到驱出队列的末尾
LFU(最少使用):使用最少使用的驱逐策略。跟踪缓存条目的访问,get()会增加缓存键的访问次数,set()充值。首先删除最低访问计数的条目 RR(随机重放):使用随机逐出策略。

告诉缓存条目存储在一个中,orderedDict(有序字典)以便可以维护基于高速缓存类型的密钥排序,而不需要额外的列表。

从本质上讲,它的关键顺序orderedDict被视为“驱逐队列”,其惯例是队列开头的条目是“较新的”,而末尾的条目是“较旧的” 需要驱逐缓存条目时,首先删除过期的条目,然后删除“较旧的”条目(队列末尾的条目)

参数解析

maxsize: int,optional --缓存字典的最大大小。默认为256
ttl: int,optional --所有缓存条目的默认TTL(有效时间)。默认值0表示条目不会过期。
timer:callable, optional --用于计算TTL到期的定时器函数,默认time.time
default: mixed, optional-get() 未找到密钥时使用的默认值或参数。如果是可调用的,传递一个key,并将该缓存key设置其返回值

代码实现

# 首先创建一个缓存对象来了解,默认缓存的大小是256,默认存活时间是关闭的,这些属性可以通过如下设置
cache = Cache(maxsize=256, ttl=0, timer=time.time)
# 设置一个缓存可以通过cache.set()
cache.set(1, "one")
# 获取缓存key的值:cache.get()
cache.get(1)
# 为每个键值对设置存活过期时间
cache.set(2, "two", ttl=1)

# 缓存函数的计算结果
@cache.memoize()
def func(a, b):
    pass
# 为缓存函数提供了键值对的存活时间
@cache.memoize(ttl=5, typed=True)
def func(a, b):
    pass
# 函数解除缓存
@cache.memoize()
def func(a, b):
    pass

# 复制
cache.copy()
# 删除一个键值对
cache.delete(1)
# 清楚整个缓存
cache.clear()
# 批量增加和删除
cache.set_many({'a':1, 'b':2, 'c':3})
cache.delete_many(['a', 'b', 'c'])

# 重置已初始化的缓存对象
cache.configure(maxsize=1000, ttl=5*60)

#通过cache.keys(), cache.values(), and cache.items()获取所有的键、值、以及键值对:
cache.keys()
cache.values()
cache.items()

# 检测键是否还存在于缓存中通过cache.has() and key in cache方法:
cache.has('a')

# 通过使用CacheManager来管理多个缓存对象:
from cacheout import CacheManager, LRUCache
cache = CacheManager({'a': {'maxsize': 100}, 
                        'b': {'maxsize': 200, 'ttl': 900}, 
                        'c': {'maxsize': 600, 'ttl': 1000}
                      }, cache_class=LRUCache)

cache['c'].configure(maxsize=1000, ttl=150000)

cache['a'].set('key1', 'value1')
value1 = cache['a'].get('key1')

cache['b'].set('key2', 'value2')

cache['c'].set('key3', 'value3')

# 清空
cache.clear_all()