美文网首页
使用lua从mysql数据库导出数据到redis与Nginx缓存

使用lua从mysql数据库导出数据到redis与Nginx缓存

作者: 月哥说了算 | 来源:发表于2019-08-18 12:52 被阅读0次

    安装lua

    有linux版本的安装也有mac版本的安装。。我们采用linux版本的安装,首先我们准备一个linux虚拟机。

    安装步骤,在linux系统中执行下面的命令。
    //下载
    curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
    //解压
    tar zxf lua-5.3.5.tar.gz
    cd lua-5.3.5
    make linux test

    此时再执行lua测试看lua是否安装成功
    [root@localhost ~]# lua
    Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio</pre>

    安装openresty

    linux安装openresty:

    1.添加仓库执行命令

     yum install yum-utils
     yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
    

    2.执行安装

    yum install openresty
    

    3.安装成功后 会在默认的目录如下:

    /usr/local/openresty
    

    测试访问

    重启下centos虚拟机,然后访问测试Nginx

    访问地址:http://192.168.200.128/

    lua脚本从数据库查询数据到redis,创建update_ad.lua

    ngx.header.content_type="application/json;charset=utf8"
    local cjson = require("cjson")
    local mysql = require("resty.mysql")
    local uri_args = ngx.req.get_uri_args()
    //地址传来的参数
    local position = uri_args["position"]
    
    local db = mysql:new()
    db:set_timeout(10000)  
    local props = {  
        host = "192.168.200.128",  
        port = 3306,  
        database = "数据库名",  
        user = "root",  
        password = "root"  
    }
    
    local res = db:connect(props)  
    local select_sql = "select url,image from tb_ad where status ='1' and position='"..position.."' and start_time<= NOW() AND end_time>= NOW()"  
    res = db:query(select_sql)  
    db:close()  
    
    local redis = require("resty.redis")
    local red = redis:new()
    red:set_timeout(2000)
    
    local ip ="192.168.200.128"
    local port = 6379
    red:connect(ip,port)
    
    red:set("ad_"..position,cjson.encode(res))
    red:close()
    
    ngx.say("{flag:true}")
    
    

    数据从redis到nginx,创建read_ad.lua

    --设置响应头类型
    ngx.header.content_type="application/json;charset=utf8"
    --获取请求中的参数ID
    local uri_args = ngx.req.get_uri_args();
    local position = uri_args["position"];
    
    --获取本地缓存
    local cache_ngx = ngx.shared.dis_cache;
    --根据ID 获取本地缓存数据
    local adCache = cache_ngx:get('ad_cache_'..position);
    
    if adCache == "" or adCache == nil then
    
        --引入redis库
        local redis = require("resty.redis");
        --创建redis对象
        local red = redis:new()
        --设置超时时间
        red:set_timeout(2000)
        --连接
        local ok, err = red:connect("192.168.200.128", 6379)
        --获取key的值
        local rescontent=red:get("ad_"..position)
        --输出到返回响应中
        ngx.say(rescontent)
        --关闭连接
        red:close()
        --将redis中获取到的数据存入nginx本地缓存
        cache_ngx:set('ad_cache_'..position, rescontent, 10*60);
    else
        --nginx本地缓存中获取到数据直接输出
        ngx.say(adCache)
    end
    
    
    

    在/usr/local/openresty/nginx/conf/nginx.conf中添加头信息,和 location信息

    server {
        listen       80;
        server_name  localhost;
    
        location /update_ad {
            content_by_lua_file /root/lua/update_ad.lua;
        }
         location /ad_read {
                #使用限流配置    burst 突发情况下 允许访问4个请求
                limit_req zone=adRateLimit burst=4 nodelay;
                content_by_lua_file /usr/local/openresty/lua/read_ad.lua;
            }
    }
    

    如果要尝试访问可将前端页面放到/usr/local/openresty/nginx/html
    下。

    相关文章

      网友评论

          本文标题:使用lua从mysql数据库导出数据到redis与Nginx缓存

          本文链接:https://www.haomeiwen.com/subject/fnlrsctx.html