当前位置:实例文章 » JAVA Web实例» [文章]LRU 缓存

LRU 缓存

发布人:shili8 发布时间:2024-11-07 07:17 阅读次数:0

**LRU 缓存**

LRU (Least Recently Used) 缓存是一种常见的缓存策略,用于优化系统性能。它通过淘汱最近使用过的数据来释放内存空间,从而避免了由于内存不足导致的性能下降。

**什么是 LRU 缓存**

LRU 缓存是一种基于时间序列的缓存策略,它根据数据的访问顺序来决定哪些数据需要被淘汱。具体来说,LRU 缓存会将最近使用过的数据放在缓存中,而将最久未使用过的数据从缓存中移除。

**如何实现 LRU 缓存**

实现 LRU 缓存有多种方法,我们可以使用以下几种方式:

1. **链表法**:我们可以使用一个双向链表来实现 LRU 缓存。每个节点代表一个缓存项,链表的头部指向最近使用过的数据,而链表的尾部指向最久未使用过的数据。
2. **哈希表法**:我们可以使用一个哈希表来实现 LRU 缓存。每个键值对代表一个缓存项,哈希表中的键是缓存项的 ID,而哈希表中的值是缓存项本身。

下面,我们将使用链表法和哈希表法两种方式分别实现 LRU 缓存。

**链表法**

class Node:
 def __init__(self, key, value):
 self.key = key self.value = value self.prev = None self.next = Noneclass LRUCache:
 def __init__(self, capacity):
 self.capacity = capacity self.cache = {}
 self.head = Node(0,0)
 self.tail = Node(0,0)
 self.head.next = self.tail self.tail.prev = self.head def get(self, key):
 if key in self.cache:
 node = self.cache[key]
 self._remove(node)
 self._add(node)
 return node.value else:
 return -1 def put(self, key, value):
 if key in self.cache:
 self._remove(self.cache[key])
 new_node = Node(key, value)
 self._add(new_node)
 self.cache[key] = new_node if len(self.cache) > self.capacity:
 node = self.head.next self._remove(node)
 del self.cache[node.key]

 def _remove(self, node):
 prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _add(self, node):
 prev_node = self.tail.prev prev_node.next = node self.tail.prev = node node.prev = prev_node node.next = self.tail


**哈希表法**

class LRUCache:
 def __init__(self, capacity):
 self.capacity = capacity self.cache = {}
 self.order = []

 def get(self, key):
 if key in self.cache:
 value = self.cache[key]
 self.order.remove(key)
 self.order.append(key)
 return value else:
 return -1 def put(self, key, value):
 if key in self.cache:
 del self.cache[key]
 self.order.remove(key)
 elif len(self.cache) >= self.capacity:
 lru_key = self.order.pop(0)
 del self.cache[lru_key]
 self.cache[key] = value self.order.append(key)


**示例**

cache = LRUCache(2)

cache.put(1,1)
cache.put(2,2)
print(cache.get(1)) # returns1cache.put(3,3) # evicts key2print(cache.get(2)) # returns -1 (not found)
cache.put(4,4) # evicts key1print(cache.get(1)) # returns -1 (not found)
print(cache.get(3)) # returns3print(cache.get(4)) # returns4


**总结**

LRU 缓存是一种常见的缓存策略,用于优化系统性能。通过淘汱最近使用过的数据来释放内存空间,从而避免了由于内存不足导致的性能下降。链表法和哈希表法两种方式分别实现 LRU 缓存,可以根据实际需求选择合适的方法。

相关标签:java缓存开发语言
其他信息

其他资源

Top