探索 Python 库:使用 Expiring Dict 进行内存缓存

发布日期:2026-07-07 09:08:03   来源 : 杭州电子商务研究院    浏览量 :12
杭州电子商务研究院 发布日期:2026-07-07 09:08:03  
12

介绍

缓存是任何数据管道或软件系统中不可或缺且极其宝贵的一部分。谈到 Python 生态系统,有几个库提供了用于在内存中缓存数据的有用 API。在本指南中,您将了解 Python 生态系统中的 Expiring Dict 库,以及如何将其用作您自己的数据管道中的高性能缓存机制。

即将到期的 Dict 安装

Expiring Dict 库提供了一个单独的类ExpiringDict,可用于实例化内存缓存。

在撰写本文时,Expiring Dict 库可与以下 Python 版本配合使用:

  • 2
  • 2.7
  • 3
  • 3.6

您可以使用pipconda安装 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 来正确处理缓存失效

您可以放心,您能够在单线程或多线程环境中轻松创建内存缓存。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据