探索 Python 库:使用 Expiring Dict 进行内存缓存
介绍
缓存是任何数据管道或软件系统中不可或缺且极其宝贵的一部分。谈到 Python 生态系统,有几个库提供了用于在内存中缓存数据的有用 API。在本指南中,您将了解 Python 生态系统中的 Expiring Dict 库,以及如何将其用作您自己的数据管道中的高性能缓存机制。
即将到期的 Dict 安装
Expiring Dict 库提供了一个单独的类ExpiringDict,可用于实例化内存缓存。
在撰写本文时,Expiring Dict 库可与以下 Python 版本配合使用:
- 2
- 2.7
- 3
- 3.6
您可以使用pip或conda安装 Expiring DIct 。
使用pip安装:
pip install expiringdict
使用conda安装:
conda install -c conda-forge expiringdict
下载库后,您可以导入它并开始使用提供的ExpiringDict类型,如下所示:
from expiringdict import ExpiringDict
过期的 Dict API
您可以使用ExpiringDict创建内存缓存,如下所示:
user_cache = ExpiringDict(max_len=50, max_age_seconds=25, items=None)
ExpiringDict类提供了三个命名参数,您可以在实例化期间使用它们。max_len参数指定缓存中允许的项目数。达到此限制时,缓存将开始从自身转储项目以腾出空间。max_age_seconds参数标记缓存中每个项目的生存时间 (TTL)。最后,items参数最初填充缓存。items 参数的类型可以是以下任何一种:
- 字典
- 有序字典
- 到期字典
获取/设置值
您可以像这样向缓存中添加一个条目:
user_cache['user_one'] = 'Alfred'
要从缓存中获取单个值,请使用get方法。以下是示例:
user_one = user_cache.get('user_one')
print(user_one) # -> 'Alfred'
如果键不存在,您可以设置默认值,如下所示:
user_two = user_cache.get('user_two', default='Fallback Charlie')
print(user_two) # -> 'Fallback Charlie'
您还可以像这样获取键值对的 TTL:
user_one = user_cache.get('user_one', with_age=True)
print(user_one) # -> ('Alfred', 20)
其他 API 方法
ExpiringDict类提供了items_with_timestamp方法,允许您获取三元组列表,其中包含每个键的键、值和 ttl。您可以像这样使用此方法:
users_with_timestamps = user_cache.items_with_timestamp()
print(users_with_timestamps) # Returns type list(('user_one', 'Alfred', 5))
还有一个ttl方法,可让您获取缓存中给定键的 TTL。以下是示例:
user_one_ttl = user_cache.ttl('user_one')
print(user_one) # -> 20
多线程缓存
Expiring Dict 库的优点之一是它确保所有关键的内部 API 方法都包含在锁中,从而使更改缓存成为线程安全的。您可以通过深入研究源代码来了解他们如何实现这一点。以下是内部 API 方法的源代码,该方法从ExpiringDict缓存中抓取一个项目:
def __getitem__(self, key, with_age=False):
""" Return the item of the dict.
Raises a KeyError if key is not in the map.
"""
with self.lock:
item = OrderedDict.__getitem__(self, key)
item_age = time.time() - item[1]
if item_age < self.max_age:
if with_age:
return item[0], item_age
else:
return item[0]
else:
del self[key]
raise KeyError(key)
注意代码中的with self.lock部分。这段代码在从内部OrderedDict中获取项目时创建了一个上下文保护。这确保了对给定键的访问是独占进行的,这意味着在使用 Expiring Dict 时,可以安全地尝试在两个不同的线程中获取和设置同一缓存中的项目。Expiring Dict 库成功锁定了核心操作,因此您不必在自己的代码中手动跟踪锁。这真是太棒了!
结论
在本指南中,您了解了 Python Expiring Dict 库及其提供的缓存功能。现在,您已经能够使用提供的ExpiringDict类来创建高效、高性能甚至多线程的内存缓存。您还知道如何通过在ExpiringDict实例上设置 TTL 来正确处理缓存失效。
您可以放心,您能够在单线程或多线程环境中轻松创建内存缓存。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~