标签: 缓存

  • 一个小的通用缓存库

    背景

    (使用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。