- LRU
1.1. 原理
LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。
1.2. 實現
最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:
新數據插入到鏈表頭部;
每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;
當鏈表滿的時候,將鏈表尾部的數據丟棄。
1.3. 分析
【命中率】
當存在熱點數據時,LRU的效率很好,但偶發性的、周期性的批量操作會導致LRU命中率急劇下降,緩存污染情況比較嚴重。
【復雜度】
實現簡單。
【代價】
命中時需要遍歷鏈表,找到命中的數據塊索引,然后需要將數據移到頭部。
class Node():
def __init__(self, value):
self.value = value
self.next = None
class Cache_LRU():
def __init__(self,n):
self.data = None
self.k = n
self.count = 0
self.head = Node(None)
self.last = self.head
def data_set(self, value):
if self.count < self.k:
#add link
self.last.next = Node(value)
self.last = self.last.next
self.count += 1
else:
#remove head
self.head.next = self.head.next.next
self.last.next = Node(value)
self.last = self.last.next
def in_cache(self, node):
# node.value -> node.next.value
value = node.value
if node.next != None:
if node.next == self.last:
self.last = node
node.value = node.next.value
tmp = node.next
node.next = node.next.next
self.last.next = Node(value)
self.last = self.last.next
def print_node(self):
node = self.head
while(node.next != None):
print(node.value, end=" ")
node = node.next
print(node.value)
def data_get(self,value):
node = self.head
while(node):
if node.value == value:
self.in_cache(node)
return True
node = node.next
self.data_set(value)
import random
count = 0
cache = Cache_LRU(6)
choices = ["1","ad","adw","adwv","awdwd"]
for i in range(100):
a = random.choice(choices)
if cache.data_get(a):
count += 1
count
95