mc.lru LRU算法库
更新时间:2025/07/01
在Gitcode上查看源码

简介

LRU 是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。 libmc中,通过使用哈希表+双向链表进行实现,每个节点Node定义为:prenextval

加载方式

lua
local lru = require 'mc.lru'

接口说明

lru.put

描述

  • 设置key对应的节点的值。
    • 如果key不存在,则新建节点,置于链表尾部。
    • 如果链表长度超标,则将处于头部的第一个节点去掉。
    • 如果节点存在,更新节点的值,同时将节点置于链表尾部。

参数

参数类型描述是否必选
key无明确限制需设置的节点的键必选
value无明确限制需设置的节点的值必选

返回

  • 超过最大缓存大小后,会返回从缓存移除的数据;其余情况返回值为nil

异常

示例

lua
local lru_cache = lru.new(1)
local val1 = lru_cache:put("k1", "v1") -- 返回nil
local val2 = lru:cache:put("k2", "v2") -- 返回"v1"

lru.get

描述

  • 查询key对应的节点,如果key存在,将节点移动至链表尾部。

参数

参数类型描述是否必选
key无明确限制需查询的节点的键必选

返回

  • key对应的节点的值

异常

示例

lua
local lru_cache = lru.new(1)
lru_cache:put("k1", "v1") 
local val = lru_cache:get("k1") -- 返回"v1"

lru.del

描述

  • 删除key对应的节点,并返回该节点

参数

参数类型描述是否必选
key无明确限制需删除的节点的键必选

返回

  • key对应的节点的值

异常

示例

lua
local lru_cache = lru.new(1)
lru_cache:put("k1", "v1") 
local value = lru_cache:del("k1") -- 返回"v1"

lru.fold

描述

  • 允许输入一个回调,遍历所有的节点进行操作

参数

参数类型描述是否必选
cbfunction回调函数必选
acc无明确限制累积值(初始值),用于存储迭代过程的中间结果,最终作为fold的返回值必选

local acc, exit_loop = cb(acc, key, val)

回调函数参数:

  • acc: 累积值,即lru.fold传入的acc对象,需要作为第一个返回值返回。
  • key: 当前节点的key值。
  • val:当前节点的value值。

回调函数返回值:

  • acc: 累积值。
  • exit_loop: 是否跳出遍历,true: 跳出, 其他值则继续。

返回

  • 回调函数处理后的最终acc

异常

示例

lua
local lru_cache = lru.new(3)
lru_cache:put("k1", 1)
lru_cache:put("k2", 2)
lru_cache:put("k3", 3) 
local result = lru_cache:fold(function(acc, key, val)
    return acc + val, false
end, acc) -- 返回6

clear

描述

  • 清空所有缓存

参数

返回

异常

示例

lua
local lru_cache = lru.new(3)
lru_cache:put("k1", 1)
lru_cache:clear() -- lru_cache为空