Nginx+Lua+redis, 商品详情页缓存技术

需要使用openresty软件

1  lua配置

    test.lua 需要写入缓存逻辑

\#user  nobody;  
worker_processes  2;  
error_log  logs/error.log;  
events {  
    worker_connections  1024;  
}  
http {  
    include       mime.types;  
    default_type  text/html;  

    #lua模块路径,其中”;;”表示默认搜索路径,默认到/usr/servers/nginx下找  
    lua_package_path "/usr/example/lualib/?.lua;;";  #lua 模块  
    lua_package_cpath "/usr/example/lualib/?.so;;";  #c模块  
    
    server {  
        listen       80;  
        server_name  _;  

        location /lua {  
            default_type 'text/html';  
            lua_code_cache off;  
            content_by_lua_file /usr/example/lua/test.lua;  
        }  
    }    
}   

2  test.lua 中缓存代码

    a)业务内容:会将商品id请求参数

    b)处理过程:

             1、应用nginx的lua脚本接收到请求

              2、获取请求参数中的商品id

              3、根据商品id,在nginx本地缓存中尝试获取数据

              4、如果在nginx本地缓存中没有获取到数据,那么就到redis分布式缓存中获取数据,如果获取到了数据,还要设置到nginx本地缓存中但是这里有个问题,

              建议不要用nginx+lua直接去获取redis数据因为openresty没有太好的redis cluster的支持包,所以建议是发送http请求到缓存数据生产服务,由该服务提供一个http接口缓存数生产服务可以基于redis cluster api从redis中直接获取数据,并返回给nginx

      c) test.lua 代码 

--读取get参数
local uri_args = ngx.req.get_uri_args()
--读取post参数
--ngx.req.read_body()
--local uri_args = ngx.req.get_post_args()

local productId = uri_args["productId"] 
local cache_ngx = ngx.shared.my_cachelocal 
productCacheKey = "product_info_"..productIdlocal 
productCache = cache_ngx:get(productCacheKey)
if productCache == "" or productCache == nil then    
   /**
   local http = require("resty.http")    
   local httpc = http.new()    
   local resp, err = httpc:request_uri("http://192.168.31.179:8080",
        {          
            method = "GET",          
            path = "/getProductInfo?productId="..productId    
        })    
    productCache = resp.body 
    httpc:close()    
    **/

    //访问redis方式
    local redis = require "resty.redis"
    local red = redis:new()
    red:set_timeout(1000) -- 1 sec
    local ok, err = red:connect("127.0.0.1", 6379)

    --set
    --local res, err = red:set(key, value)

    --get
    local productCache, err = red:get(key)
    red:close()

    cache_ngx:set(productCacheKey, productCache, 10 * 60)
end

ngx.say(productCache)

 

你可能感兴趣的:(Web,Lua)