python的缓存库(cacheout)
文档地址: 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()