CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
高级技巧语法算法996引擎

Lua LRU缓存:双向链表与哈希的合体

2026-09-27 23:30 作者:996 技术组 996引擎Lua教程传奇脚本高级技巧语法算法996引擎

【语法】
一、机制原理
抛坑提问:缓存设了上限一百条,满了之后该挤掉谁?答案是最近最少使用的先走,这就是 LRU。要让它三个操作都够快,得两张结构合体:哈希表负责键到节点的直达映射,查找一步到位;双向链表负责使用顺序,头部放最新、尾部放最旧。命中就把节点摘下来插到头部,满了就摘掉尾部节点并从哈希表里销户——查、增、挤三个操作全是常数级,单靠数组或单靠链表都做不到。
二、错误写法

lua
-- 错误:数组缓存线性查找加头部插入搬移
local cache = {}
function put(key, value)
    for _, it in ipairs(cache) do
        if it.key == key then
            it.value = value
            return
        end
    end
    table.insert(cache, 1, {key = key, value = value})
end

三、正确写法

lua
local LRU = {}
LRU.__index = LRU
function LRU.new(cap)
    local o = setmetatable({cap = cap, map = {},
        size = 0, head = {}, tail = {}}, LRU)
    o.head.next = o.tail
    o.tail.prev = o.head
    return o
end
local function detach(node)
    node.prev.next = node.next
    node.next.prev = node.prev
    node.prev, node.next = nil, nil
end
local function toFront(self, node)
    node.next = self.head.next
    node.prev = self.head
    self.head.next.prev = node
    self.head.next = node
end
function LRU:get(key)
    local node = self.map[key]
    if node == nil then return nil end
    detach(node)
    toFront(self, node)
    return node.value
end
function LRU:put(key, value)
    local node = self.map[key]
    if node ~= nil then
        node.value = value
        detach(node)
        toFront(self, node)
        return
    end
    if self.size >= self.cap then
        local old = self.tail.prev
        detach(old)
        self.map[old.key] = nil
        self.size = self.size - 1
    end
    node = {key = key, value = value}
    self.map[key] = node
    toFront(self, node)
    self.size = self.size + 1
end

四、引擎验证
容量设三依次放入四条,最先放入的自动出户;命中过的条目在挤占时存活到尾,使用顺序与预期一致。
五、FAQ
问:为什么要双向链表?
答:摘除任意节点不用从头找前驱,摘与插都是常数操作。
问:哨兵头尾的作用?
答:省去头空尾空的分支判断,边界统一。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →