讲师中心 微信公众号
AI工具推荐 视频效率加速

如何利用Lua脚本配合共享内存自定义复杂的分布式缓存清理

千瑶同学_1982

千瑶同学_1982

发布时间:2026-06-02 08:56:35

|

315人浏览过

|

来源于php中文网

原创

可直接用 Lua 脚本配合 lua_shared_dict 实现自定义复杂清理:通过前缀索引或时间分片桶在共享内存中显式记录元数据,再原子化批量删除,避免 flush_all 误伤热数据。

如何利用lua脚本配合共享内存自定义复杂的分布式缓存清理

直接用 Lua 脚本配合 OpenResty 的 lua_shared_dict 实现“自定义复杂清理”,核心在于:不依赖外部系统、不重启 Nginx、不逐个遍历键,而是通过设计可追踪的元数据结构 + 原子操作,在共享内存内完成精准、可控、低开销的批量清理。

一、为什么不能直接遍历清空?

OpenResty 的共享字典(如 ngx.shared.my_cache)**不提供 keys() 或 scan 接口**。它底层基于红黑树+LRU队列,只支持按 key 精确读写和带过期时间的自动淘汰。强行“清空所有”只能靠 flush_all(),但这是全局暴力清除,会误伤未到期的热数据,且无法按业务维度(如某类商品、某用户前缀、某时间窗口)选择性清理。

二、构建可清理的缓存元数据结构

关键思路:把“哪些 key 属于同一组”这个关系,显式记录在共享内存中。常用两种轻量设计:

  • 前缀索引表:为每个业务前缀(如 product:user:1001:)维护一个 Set 类型的索引条目,每次 set 缓存时同步写入该前缀下的 key 名(例如 product:1001 写入到 idx:product 这个列表);清理时先读取 idx:product,再对其中每个 key 调用 delete()
  • 时间戳+分片桶:对需要按时间清理的缓存(如 5 分钟内的搜索结果),将 key 按分钟哈希到 60 个桶中(如 bucket:202605271905),写入时同时存入主缓存和对应桶;清理旧桶即可批量失效一批数据,无需查 key 列表。

三、用 Lua 脚本实现原子化清理逻辑

以下是一个基于前缀索引的清理函数示例(放在 init_by_lua_block 或独立模块中):

-- 假设已定义:cache = ngx.shared.cache,idx = ngx.shared.idx

function clear_by_prefix(prefix)
  local idx_key = "idx:" .. prefix
  local keys, err = idx:get(idx_key)
  if not keys then return 0 end -- 无索引,跳过
  local count = 0
  for _, key in ipairs(keys) do
    if cache:delete(key) == 1 then count = count + 1 end
  end
  idx:delete(idx_key) -- 清空索引本身
  return count
end

注意:idx 字典建议用 lua_shared_dict idx 2m 单独配置,避免与主缓存争用空间;索引值推荐存为 Lua table 序列化后的字符串(用 cjson.encode),读取时反序列化。

四、触发清理的三种可靠方式

  • HTTP 管理接口:配一个仅限内网访问的 location /admin/cache/clear,用 content_by_lua_block 解析 query 参数(如 ?prefix=product),调用上述清理函数并返回统计数。
  • 定时主动清理:在 init_worker_by_lua_block 中启动一个每分钟检查的 timer,自动清理超过 TTL 的索引桶或过期前缀(适合冷数据归档场景)。
  • 写时联动清理:当上游服务通知“商品 1001 已下架”,Nginx 收到 Webhook 后立即执行 clear_by_prefix("product:1001"),保证缓存与业务状态强一致。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

363

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2967

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

5425

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

541

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1436

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3898

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

102

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

397

2026.01.13

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn