Nginx链接MySQL、缓存例子

lua_shared_dict addresses_cache 10m;

server {
    listen 80;
    server_name example.com;

    location / {
        access_by_lua_block {
            local mysql = require "resty.mysql"
            local key = ngx.var.host .. ngx.var.uri
            local cache = ngx.shared.addresses_cache

            -- 从缓存中获取数据
            local address = cache:get(key)
            if not address then
                -- 缓存中不存在,从数据库查询,并更新缓存
                local db, err = mysql:new()
                if not db then
                    ngx.log(ngx.ERR, "failed to create mysql object: ", err)
                    return ngx.exit(500)
                end

                db:set_timeout(1000)

                local ok, err, errno, sqlstate = db:connect{
                    host = "127.0.0.1",
                    port = 3306,
                    database = "mydb",
                    user = "myuser",
                    password = "mypassword"
                }

                if not ok then
                    ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errno, " ", sqlstate)
                    return ngx.exit(500)
                end

                local res, err, errno, sqlstate = db:query("SELECT address FROM addresses WHERE host = '" .. ngx.var.host .. "' AND uri = '" .. ngx.var.uri .. "'")

                if not res then
                    ngx.log(ngx.ERR, "bad result: ", err, ": ", errno, ": ", sqlstate, ".")
                    return ngx.exit(500)
                end

                address = res[1] and res[1].address or "" -- 假设地址数据在第一行
                cache:set(key, address, 60) -- 将结果存入缓存,缓存时间为60秒
            end

            ngx.var.proxy_pass = "http://" .. address -- 将地址作为反向代理目标
        }
        proxy_pass $proxy_pass;
    }
}

代码未经测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值