Nginx Lua环境下如何解析Redis内存多行变量并截取目标数值?
解决Redis内存信息解析问题:提取
used_memory_rss数值 我来帮你搞定这个Redis内存健康检查的关键部分——从返回的多行memory信息里提取used_memory_rss的数值。
首先,red:info('memory')返回的是按行分割的字符串,每一行都是key:value的格式。我们可以用Lua的字符串匹配功能精准定位目标行,再提取对应数值。
具体实现逻辑
把你代码里的red_used_memory = ...替换成下面这段代码:
local red_used_memory = nil -- 遍历memory的每一行,匹配目标字段 for line in string.gmatch(memory, "[^\r\n]+") do local key, value = string.match(line, "^([^:]+):(%d+)$") if key == "used_memory_rss" then red_used_memory = tonumber(value) break -- 找到目标后直接退出循环,提升效率 end end -- 处理未找到目标字段的异常情况 if not red_used_memory then ngx.log(ngx.ERR, "Failed to extract used_memory_rss from Redis info") ngx.status = 500 return end
代码细节解释
- 行遍历:用
string.gmatch(memory, "[^\r\n]+")把多行字符串拆分成单独的行,自动忽略换行符。 - 字段匹配:通过正则
^([^:]+):(%d+)$精准匹配key:数字值的格式,避免误匹配其他带字符的字段(比如used_memory_human)。 - 类型转换:用
tonumber()把提取到的字符串转成数字类型,方便后续和内存阈值做数值比较。 - 异常兜底:如果没找到
used_memory_rss字段,直接返回500状态并记录错误日志,避免后续逻辑因nil值出错。
补全后的完整Location代码
我还帮你补了几个容易忽略的健壮性细节:
location = /healthcheck { content_by_lua_block { local redis = require "resty.redis" -- 别忘了引入redis模块! local red = redis:new() local used_mem_limit = 536870912 -- 加上local修饰,避免全局变量污染 -- 连接Redis local ok, err = red:connect(ngx.var.redis_host, 6379) if not ok then ngx.log(ngx.ERR, "Redis connection error: ", err) ngx.status = 500 return end -- 设置连接超时 red:set_timeout(1000) -- 获取Redis内存信息(新增错误处理) local memory, err = red:info('memory') if not memory then ngx.log(ngx.ERR, "Failed to get Redis memory info: ", err) ngx.status = 500 return end -- 提取used_memory_rss数值 local red_used_memory = nil for line in string.gmatch(memory, "[^\r\n]+") do local key, value = string.match(line, "^([^:]+):(%d+)$") if key == "used_memory_rss" then red_used_memory = tonumber(value) break end end -- 处理未找到字段的情况 if not red_used_memory then ngx.log(ngx.ERR, "Failed to extract used_memory_rss from Redis info") ngx.status = 500 return end -- 设置响应状态码(简化逻辑) local http_code = red_used_memory < used_mem_limit and 200 or 500 ngx.status = http_code } }
内容的提问来源于stack exchange,提问作者d.ansimov
相关产品推荐
相关产品推荐

