OpenResty+lua+redis+mysql多级缓存

Redis/缓存系统
448
0
0
2022-04-14

lua与Openresty介绍

lua是一个小巧的脚本语言,由标准C编写而成,几乎在所有操作系统和平台上都可以编译运行。其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

应用场景:游戏开发、独立应用脚本、redis中嵌套调用实现类似事务的功能,web容器汇总处理NGINX的过滤缓存等等逻辑

Openresty介绍

OpenResty是一个基于Nginx与Lua的高性能web平台,由中国人章亦春发起,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便搭建能处理超高并发、扩展性极高的动态Web应用、web服务和动态网关

OpenResty简单理解成就相当于封装了NGINX,并且集成了LUA脚本,开发人员只需要简单的使用其提供了模块就可以实现相关的逻辑,而不像之前,还需要在NGINX中编写lua的脚本。

1. 拉取一个Openresty的镜像

docker pull openresty/openresty

2. 进入容器 获取配置文件 default.conf 复制到宿主机

docker cp openresty:/etc/nginx/conf.d/default.conf /docker/openresty/conf/default.conf

3. 修改nginx配置文件

server {
    listen 90;
    listen [::]:90;
    server_name localhost;
    root /docker/www/webserver; 
    index index.html;

    location /your key {
      content_by_lua_file /docker/www/lua/lmrs_home_index.lua;
    }
}

4.创建lua配置文件

ngx.header.content_type = "application/json;charset=utf8"
local cache_ngx = ngx.shared.dis_cache;
local contentCache = cache_ngx:get("your key");
if contentCache == "" or contentCache == nil then
    local redis = require("resty.redis");
    local red = redis:new()
    red:set_timeout(2000)
    red:connect("your host", 6379)
    local rescontent = red:get("your key");if ngx.null == rescontent or false == rescontent or "" == rescontent then
        local cjson = require("cjson");
        local mysql = require("resty.mysql");
        local db = mysql:new();
        db:set_timeout(2000)
        local props = {
            host = "your host",
            port = 3306,
            database = "your database",
            user = "your user",
            password = "your password"}
        local res = db:connect(props);
        local select_sql = "select * from lmrs_product_categorys"
        res = db:query(select_sql);
        local responsejson = cjson.encode(res);
        red:set("your key", responsejson);
        ngx.say(responsejson);
        db:close()else
        cache_ngx:set("your key", rescontent, 10 * 60);
        ngx.say(rescontent)
    end
    red:close()else
    ngx.say(contentCache)
end

5. nginx配置

lua_shared_dict dis_cache 10m;
server {
      listen 90;
      listen [::]:90;
      server_name localhost;
      root /docker/www/webserver;
      index index.html login.html ;
      location /your key {
        content_by_lua_file /docker/www/lua/lmrs_home_index_category.lua;}
}

6. 测试 : 192.168.126.105:90/your key