OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

46 | 答疑(四):共享字典的缓存是必须的吗?

后续文章
上次总结
文章主题总结

该思维导图由 AI 生成,仅供参考

你好,我是温铭。
专栏更新到现在,OpenResty 第四版块 OpenResty 性能优化篇,我们就已经学完了。恭喜你没有掉队,仍然在积极学习和实践操作,并且热情地留下了你的思考。
很多留言提出的问题很有价值,大部分我都已经在 App 里回复过,一些手机上不方便回复的或者比较典型、有趣的问题,我专门摘了出来,作为今天的答疑内容,集中回复。另一方面,也是为了保证所有人都不漏掉任何一个重点。
下面我们来看今天的这 5 个问题。

问题一:如何完成 Lua 模块的动态加载?

Q:关于 OpenResty 实现的动态加载,我有个疑问:在完成新文件替换后,如何用 loadstring 函数完成新文件的加载呢 ?我了解到,loadstring 只能加载字符串,如果要重新加载一个 lua 文件 / 模块,在 OpenResty 中要如何做到呢?
A:我们知道,loadstring 是加载字符串使用的,而 loadfile 可以加载指定的文件,比如: loadfile("foo.lua")。事实上,这两个命令达到的效果是一样的。
至于如何加载 Lua 模块,下面是一个具体的示例:
resty -e 'local s = [[
local ngx = ngx
local _M = {}
function _M.f()
ngx.say("hello world")
end
return _M
]]
local lua = loadstring(s)
local ret, func = pcall(lua)
func.f()'
这里的字符串 s,它的内容就是一个完整的 Lua 模块。所以,在发现这个模块的代码有变化时,你可以用 loadstring 或者 loadfile 来重启加载。这样,其中的函数和变量都会随之更新。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文主要围绕OpenResty性能优化展开,作者回答了读者提出的五个问题。首先,作者介绍了如何完成Lua模块的动态加载,以及在OpenResty中重新加载Lua模块的方法。其次,作者解释了为什么OpenResty不禁用阻塞操作,以及对性能优化的态度和方法。然后,作者讨论了LuaJIT的NYI操作对性能的影响,并强调了性能优化需要从宏观视角看待。接着,作者比较了动态上游的两种实现方式,并指出了它们各自的优劣势。最后,作者讨论了共享字典的缓存是否必须的问题,提出了在某些特例情况下,只使用lru cache也是可以接受的观点。整体而言,本文涵盖了OpenResty性能优化中的关键问题,为读者提供了有价值的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 东不懂
    用vim开发OpenResty,没有找到合适的代码补齐插件,写的还挺难受的。想问下,你这方面开发用的什么环境

    作者回复: 我用的是 vscode

    2019-09-10
    2
  • Shliesce
    哈哈哈,第五个问题是我对于共享内存的理解,有点偏主观意识了,见笑了。结合我们公司的场景来看这个问题,我们的数据源也是存在consul或者etcd这样的组件中,与openresty是两个团队分开维护的,如果不使用shared dict的话,一旦数据源故障,就会导致openresty无法正常reload,所以如果我们有shared dict这一层缓存的话就可以与数据源解耦,解决强依赖的问题,哪怕数据源故障,仍然可以正常变更openresty,只是无法新增数据。我们认为这个方案会更优雅一些。
    2019-11-20
    4
  • 杨文波
    问一节和这章无关的问题,若在upstream列出的机器,balancer_by_lua里面计算出来的机器不在upstream里面,nginx的keepalive连接池还有作用吗?
    2022-02-18
  • Geek_6a1df0
    etcd 的 watch 机制,可以用来解决 OpenResty 缺少 worker 进程间直接通信的这个问题吗?
    2020-10-01
    2
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部