带自动过期的Timetolive(TTL)缓存

autottlcache的Python项目详细描述


自动缓存

一个具有自动过期的生存时间(TTL)缓存字典。在

安装

要从PyPI安装:

$ pip install autottlcache

使用

TTL缓存的行为非常类似于字典。实际上,它是一个MutableMapping,因此支持 字典接口。但是它有一个重要的区别,那就是它里面的项目 过期并自动删除。在

让我们创建一个AutoTTLCache,最大大小为12个实体,TTL为30秒:

^{pr2}$

我们可以向缓存中添加条目:

>>> cache[1] = 56
>>> cache[2] = 89
>>> cache[3] = 99
>>> cache[4] = 10
>>> cache[5] = 20

并通过反复请求缓存列出其密钥来观察它们的过期:

>>> list(cache.keys())
[2, 3, 4, 5]

我们花了很长时间添加第一个已经过期的密钥:

>>> list(cache.keys())
[3, 4, 5]

现在第二个也不见了:

>>> list(cache.keys())
[3, 4, 5]

这一次我们很快就可以在第三个过期之前进入:

>>> list(cache.keys())
[3, 4, 5]
>>> list(cache.keys())
[3, 4, 5]
>>> list(cache.keys())
[3, 4, 5]
>>> list(cache.keys())
[4, 5]
>>> list(cache.keys())
[4, 5]
>>> list(cache.keys())
[4, 5]
>>> list(cache.keys())
[5]
>>> list(cache.keys())
[5]
>>> list(cache.keys())
[5]
>>> list(cache.keys())
[5]
>>> list(cache.keys())
[5]
>>> list(cache.keys())
[]

全都消失了。在

当调用缓存对象上的操作时,将从缓存中删除过时的项,例如 当一个项目被检索时,或者由一个连续运行的后台线程周期性地 删除过期项目。将以10倍于TTL周期的频率检查缓存,因此 缓存中TTL为30秒的项的生存时间不应超过33秒。在

编程风格

由于项目将自动过期,为了避免竞争条件,您应该强烈建议 一种比权限(EAFP)编程风格更容易请求原谅,而不是外观 在你跳跃之前的风格。在

危险比赛条件:

from autottlcache import AutoTTLCache
cache = AutoTTLCache(maxsize=100, ttl=30)
cache["daffodils"] = Image("daffodils-3280x2040.png")

# ...

if "daffodils" in cache:
    # What happens if "daffodils" expires here?
    image = cache["daffodils"]  # This could raise a key error which is unhandled
else:
    print("No flowers for you!")

最好使用单个操作检索对象并处理失败:

from autottlcache import AutoTTLCache
cache = AutoTTLCache(maxsize=100, ttl=30)
cache["daffodils"] = Image("daffodils-3280x2040.png")

# ...

try:
    image = cache["daffodils"]
except KeyError:
    print("No flowers for you!")
else:
    display(image)

资源利用

在一个或多个AutoTTLCache 物体是现存的。线程将在创建第一个AutoTTLCache时启动,并且 在最后一个AutoTTLCache完成后立即终止。在

发展

要释放,需要一个简短的手动过程:

$ bumpversion patch
$ python setup.py sdist bdist_wheel
$ twine upload dist/* --config-file=path/to/sixty-north.pypirc

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
apache HttpClient execute(HttpUriRequest请求)和execute(HttpHost目标,HttpRequest请求)之间的java差异   如何向java进程传递多个密码   java servlet从外部事件调用网页中的javascript弹出/模式对话框   正在重置Unix Java路径变量   java将@Named managed bean注入另一个重用JSF页面?   java Cookie未显示在请求中   java如何记录用户的操作并在用户返回时重播?   java FTPSClient抛出异常javax。网ssl。SSLHandshakeException:握手期间远程主机关闭连接   java“变量可能尚未初始化”在何处使用开关盒进行初始化?   初始化Double java数组   java Android:如何通过按钮启动活动?   java设置外观和感觉颜色   计算两个时间戳对象之间的时间差的日期   扩展画布的类时,绘制方法出现java错误   java在不同的线程中运行JNI方法   java Spring引导OIDC刷新令牌场景   Java slf4j实现:logback vs log4j   java KeyEvents新的KeyEvent变量?   为什么java的模式和匹配器类中没有公共构造函数?   java在JVM上禁用本地JMX连接