·
日常教程 ·
30731
本篇文章给大家分享的是有关如何用LinkedHashMap打造FIFO和LRU缓存系统,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
对于缓存来说,我相信很多人都不会陌生。一般的,对于常用的一些数据,基础数据等,也或者是为了高并发,比如抢购等把热点数据放入缓存中以实现高并发快速响应。
说到缓存,Redis、memcached 等在面试中属于必问的知识点了。虽然这些专门的缓存系统做的很强大,看起来很复杂,但底层的原理其实很简单。今天我们一起来通过 LinkedHashMap 来打造两个 FIFO 和 LRU 机制的缓存系统。
FIFO 很好理解,就是 First In First Out,先入先出。就和队列一样,先进队列的先出队列。根据这个 FIFO 的这个特点,我们就可以通过 LinkedHashMap 来实现这种机制的缓存系统了。
上面几行代码就搞定了 FIFO 机制的缓存。测试代码也很简单,如下所示:
测试结果截图如下所示:
通过上面这个测试结果,可以看出,这个缓存系统并不完美。当我更新元素后,我想让它重新插入队列,相当于重新入队。因为它刚刚被更新过,说明使用频次可能更高一些。于是 LRU,这种缓存淘汰机制就应用而生了。
LRU 就是(Least Recently Used),最近最少使用,意思就是最近读取的数据放在最前面,最早读取的数据放在最后面,如果这个时候有新的数据进来,当缓存空间不够时,那么最后面存储的数据淘汰。实现代码如下所示:
下面我们来看看测试代码:
运行之后的效果截图如下所示:
以上就是如何用LinkedHashMap打造FIFO和LRU缓存系统,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注本站行业资讯频道。
lru_cache装饰器通过maxsize参数控制缓存容量:None为无限制,正整数指定最多缓存的参数组合数,0则禁用缓存;参数须可哈希,支持cache_info()查看状态、cache_clear()清空缓存。 lru_cache装饰器怎么用,参数maxsize控制什么 functools.lru...
functools.lru_cache不用手写双向链表,因其底层由C实现哈希表+双向链表,性能高、线程安全、自动处理参数哈希与类型感知,而手动用OrderedDict易出错且慢。 为什么functools.lru_cache不用自己写双向链表 因为Python标准库的lru_cache已经用C实现了...
Python实现LRU缓存,核心在于O(1)时间复杂度完成get和put操作,同时自动淘汰最久未使用的项。标准解法是用OrderedDict(Python3.7+中普通dict也保持插入顺序,但OrderedDict提供了move_to_end()这一关键能力)。 ReplitGhostwrite ...
优先选lru;因为functools.lru_cache开箱即用、性能优、线程安全,而lfu无标准实现、手写易错、开销大,仅在明确存在高频固定key时才可能有优势。 LRU和LFU在Python里到底用哪个?functools.lru_cache是开箱即用的,functools.cache(Pyth...
LRU缓存必须用双向链表+哈希表,因单纯dict无法O(1)删除最久未使用项;双向链表支持O(1)节点移动,哈希表提供O(1)查找,二者协同实现get/put的常数时间复杂度。 LRU缓存为什么必须用双向链表+哈希表 单纯用dict无法在O(1)时间内删除最久未使用的项,因为Python字典不保证访...
lru_cache不支持TTL,手动加时间判断会破坏原子性;ttlcache库专为LRU+TTL设计,自动过期检查;手写需耦合访问顺序、过期时间和访问时间;Redis缺精确LRU语义。 为什么不能直接用lru_cache加手动过期? functools.lru_cache本身不支持TTL(Time-...
用互斥锁保护核心操作即可实现线程安全的LRU缓存,关键在于保证get/put原子性;借助OrderedDict天然顺序特性,通过move_to_end和popitem(last=False)实现热度提升与尾部淘汰,配合threading.Lock确保并发安全。 用互斥锁保护核心操作,就能实现一个线程...
本文小编为大家详细介绍“Python怎么使用LRU缓存策略进行缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么使用LRU缓存策略进行缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 一、Python缓存①缓存作用缓存是一种优化技术,可以在应用程序中使...