You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码细节解释

  1. 行遍历:用string.gmatch(memory, "[^\r\n]+")把多行字符串拆分成单独的行,自动忽略换行符。
  2. 字段匹配:通过正则^([^:]+):(%d+)$精准匹配key:数字值的格式,避免误匹配其他带字符的字段(比如used_memory_human)。
  3. 类型转换:用tonumber()把提取到的字符串转成数字类型,方便后续和内存阈值做数值比较。
  4. 异常兜底:如果没找到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:18:49