在大模型推理服务中,缓存机制是提升响应速度和降低计算资源消耗的关键技术之一。本文将对比两种经典缓存算法:LRU(Least Recently Used)与LFU(Least Frequently Used),分析其在实际应用中的表现差异。
LRU 缓存机制
LRU基于“最近最少使用”的原则,当缓存满时,淘汰最久未被访问的条目。其优势在于实现简单、符合直觉,适用于访问模式相对均匀的场景。
核心逻辑代码示例:
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.cache = OrderedDict()
self.capacity = capacity
def get(self, key: int) -> int:
if key in self.cache:
self.cache.move_to_end(key)
return self.cache[key]
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.cache.move_to_end(key)
elif len(self.cache) >= self.capacity:
self.cache.popitem(last=False)
self.cache[key] = value
LFU 缓存机制
LFU则根据访问频率进行淘汰,访问次数最少的条目优先被淘汰。在用户行为存在明显偏好分布时,LFU能更好地保留高频访问数据。
核心逻辑代码示例:
import heapq
from collections import defaultdict
class LFUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = dict() # key -> (value, freq)
self.freq_map = defaultdict(list) # freq -> list of keys
self.min_freq = 0
def get(self, key: int) -> int:
if key not in self.cache:
return -1
value, freq = self.cache[key]
self.freq_map[freq].remove(key)
if not self.freq_map[freq] and freq == self.min_freq:
self.min_freq += 1
self.freq_map[freq + 1].append(key)
self.cache[key] = (value, freq + 1)
return value
def put(self, key: int, value: int) -> None:
if self.capacity <= 0:
return
if key in self.cache:
self.get(key)
self.cache[key] = (value, self.cache[key][1])
else:
if len(self.cache) >= self.capacity:
key_to_remove = self.freq_map[self.min_freq].pop(0)
del self.cache[key_to_remove]
self.freq_map[1].append(key)
self.cache[key] = (value, 1)
self.min_freq = 1
实际场景对比
在大模型推理中,缓存命中率是衡量性能的重要指标。LRU适用于访问模式随机、热点不明显的情况;而LFU更适合用户行为存在稳定偏好的场景,例如推荐系统。
建议:
- 对于通用推理服务,建议使用LRU以降低实现复杂度;
- 对于有明确访问规律的场景(如推荐、搜索),可考虑实现LFU或混合缓存策略。

讨论