背景
(使用python语言)
非常常见的一个应用场景, 经常会有这样的场景,某个服务需要大量读取db,为了缓解db的压力,可以在服务上做一些db的缓存,降低db的压力,提高服务的效率。
重复写多了就想独立成一个小模块,只需要简单的接口就能在进程上提供缓存命中的库,而且似乎还能提供一种更加通用的功能。遇到了这个场景不止一次,之前每次在这个场景下,我都是重复的用两个dict,一个存上次访问时间,一个存上次访问到的数据,然后是在下次访问的时候判断是否需要重新拉取db。
这里有一个细节是从来不会主动删除数据,在访问的数据量不大的情况下,我们的业务是能够承受这种级别的内存缓存数据的,之前就没想那么多。
但这次的工作场景是存不下的,必须要主动删除不必要的缓存数据,就想做一个通用一点的接口。
接口
缓存系统内存空间是有上限的,需要主动过期不必要的缓存,常见的选择策略有下面几种
- Least-Recently-Used(LRU)
- Least-Frequently-Used(LFU)
- First in First Out(FIFO)
提供一个类作为缓存系统,缓存数据为基础缓存存储单元,本身的数据结构:
- 外部定时器回调(也可以用单次访问来做触发)
- 基础缓存存储单元缓存最大数量
- 缓存数据的dict
- 过期策略(LRU,LFU)
- 缓存过期时间(即使一直在内存中,也需要重新读db)
- 使用者要提供缓存数据未命中时,数据生成函数(db访问函数)
- 缓存过期回调函数
基础缓存存储单元本身包含:
- 缓存数据的key
- 缓存数据本身
- 缓存上次访问时间
- 缓存上次刷新时间
- 过期回调函数
需要提供的接口:
- 缓存删除函数:根据策略,将缓存删除到只剩最大数量;
- 访问缓存数据(触发缓存删除函数,并且不存在则触发生成函数);
- 新增缓存数据的函数,这个函数会作为数据生成函数的参数提供;
End。