一个小的通用缓存库

标签:

背景

(使用python语言)

非常常见的一个应用场景, 经常会有这样的场景,某个服务需要大量读取db,为了缓解db的压力,可以在服务上做一些db的缓存,降低db的压力,提高服务的效率。

重复写多了就想独立成一个小模块,只需要简单的接口就能在进程上提供缓存命中的库,而且似乎还能提供一种更加通用的功能。遇到了这个场景不止一次,之前每次在这个场景下,我都是重复的用两个dict,一个存上次访问时间,一个存上次访问到的数据,然后是在下次访问的时候判断是否需要重新拉取db。

这里有一个细节是从来不会主动删除数据,在访问的数据量不大的情况下,我们的业务是能够承受这种级别的内存缓存数据的,之前就没想那么多。

但这次的工作场景是存不下的,必须要主动删除不必要的缓存数据,就想做一个通用一点的接口。

接口

缓存系统内存空间是有上限的,需要主动过期不必要的缓存,常见的选择策略有下面几种

  • Least-Recently-Used(LRU)
  • Least-Frequently-Used(LFU)
  • First in First Out(FIFO)

提供一个类作为缓存系统,缓存数据为基础缓存存储单元,本身的数据结构:

  1. 外部定时器回调(也可以用单次访问来做触发)
  2. 基础缓存存储单元缓存最大数量
  3. 缓存数据的dict
  4. 过期策略(LRU,LFU)
  5. 缓存过期时间(即使一直在内存中,也需要重新读db)
  6. 使用者要提供缓存数据未命中时,数据生成函数(db访问函数)
  7. 缓存过期回调函数

基础缓存存储单元本身包含:

  1. 缓存数据的key
  2. 缓存数据本身
  3. 缓存上次访问时间
  4. 缓存上次刷新时间
  5. 过期回调函数

需要提供的接口:

  1. 缓存删除函数:根据策略,将缓存删除到只剩最大数量;
  2. 访问缓存数据(触发缓存删除函数,并且不存在则触发生成函数);
  3. 新增缓存数据的函数,这个函数会作为数据生成函数的参数提供;

End。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注