缓存是什么?缓存是一门优化技术,就是将数据存放在比访问源数据成本更低、速度更快的位置上。 比如别人在微信上发送一个文件给你,你第一次访问可能要下载这源文件,然后下载到本地,等你下一次在打开它的时候,其实是从本地打开的。 那么这里的本地存放位置相当于是“缓存”,它比再去访问源文件,比如要下载,速度更快、成本更低。
1. lru_cache装饰器是什么了?
我们可以用一个字典来模拟这种策略,比如定义一个dict,如果该元素不在dict中,我们就push进去,但是这样就会存在一个问题,这个dict的数目会越来越多,因为它没有丢弃的过程,最后可能会导致缓存崩溃。因此,一个好的缓存丢弃(驱除)策略是十分必要的。下图是常见的缓存驱除策略,这里我们以LRU (Least recent used,最近最少使用策略)。
2. 它的主要思想
就是丢弃最近最不常用的条目(数据)。
3. 它的主要实现原理
它首先会定义一个“缓存池”,可能比喻不是特别恰当。当新来的一个数据,我们把他放到队列的开头,下次遇到新的数据时候,我们将新的数据放到开头;如果遇到之前的数据,那我们将这个数据从缓存中拿出,重新放到开头,相当于重新加入缓存。当加入的数据超过“缓存池”的大小的时候,比如这里的maxsize=128,一般是2的倍数?幂次?。这个时候我们可能需要驱除缓存(缓存丢弃、缓存命中),我们开始丢弃“缓存池”最下方的数据,保存“缓存池” 容量的不变性。
4.它的主要应用场景
针对存在递归、或者大量复杂重复性访问的时候,使用LRU_Cache装饰器不乏是一个不错的选择。比如这里通过路径访问背景图像,存放成PIL时候,它是会进行大量的读取背景图像,同时的话,可能会遇到重复的情况,因为背景图像就那么多。这个时候,如果访问的路径已经存在过了,且在“缓存池”中,那么我们就可以直接进行读取内存中PIL数据,而不需要在open,转RGBA了。
5.参考
- 在 Python 中使用 LRU 缓存策略
- python实现LRU缓存淘汰
好像很久没写博客了。。。
|