mc.lru LRU算法库
更新时间:2025/07/01
在Gitcode上查看源码简介
LRU 是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。 libmc中,通过使用哈希表+双向链表进行实现,每个节点Node定义为:pre
、next
、val
。
加载方式
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
描述
- 允许输入一个回调,遍历所有的节点进行操作
参数
参数 | 类型 | 描述 | 是否必选 |
---|---|---|---|
cb | function | 回调函数 | 必选 |
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为空