🚀用Python实现文件缓存
00 分钟
2024-11-11
type
status
date
slug
summary
tags
category
icon
password
本文实现了一个文件缓存,它类似于Python的lru_cache, 但它将值存储在文件而不是内存中

缓存函数

要使用它,只需将file_cache装饰器添加到函数中即可。比如:
 

lru_cache的不同

lru_cache 非常适合用于缓存重复调用的函数,但它不支持两个关键功能。
  1. 缓存持久化
    1. lru_cache 将结果存储在内存中,这意味着下次运行程序时缓存将为空。 file_cache 将结果存储在磁盘上。当然,也可以使用Redis,但这需要额外的配置和成本,写入磁盘更加容易设置和管理,更适用于于一些特殊场景。
  1. lru_cache 不支持参数的忽略
    1. lru_cache 会根据函数的所有参数执行缓存策略,任意一个参数变化,都将使缓存失效。如果希望某些参数的变化不会让缓存失效,它是做不到的
       

函数解析

文件缓存主要包括2个方法,recursive_hashfile_cache

recursive_hash

Python本身并不支持对对象进行hash
hashlib.md5会报错TypeError: object supporting the buffer API required,而recursive_hash 则适用于任何python对象
 

file_cache

file_cache 是一个装饰器,为我们处理缓存逻辑。
 

缓存键的创建和失效条件

假如希望在下面两种情况下都是将缓存失效
  1. 函数的参数发生变化
  1. 函数代码发生变化
情况1通过recursive_hash 处理,情况2使用inspect.getsource(func)将函数的源代码添加到哈希中,当代码更改时正确地丢失缓存。
 

缓存的命中和未命中

最后,检查缓存键是否存在,并在缓存未命中的情况下写入缓存