广告二级缓存方案

什么是Lua

  • 定义:一个轻量级基于C语言实现的脚本语言

  • 场景:

    • 游戏开发
    • 自动化运维(Lua、Python)
    • Redis结合实现批量的原子性操作
  • 语法

    • 注释

      • 单行:–

      • 多行:

        ‐‐[[
        多行注释
        多行注释
        ‐‐]]
        
    • 关键字
      广告二级缓存方案_第1张图片

    • 变量

      • 全局:无关键字
      • 局部:local关键字
    • 数据类型8种

    广告二级缓存方案_第2张图片

    • 流程控制

      • 判断结束一定要使用end
      ‐‐[ 0 为 true ]
      if(0) then
      print("0 为 true")
      else
      print("0 不为true")
      end
      
    • 函数的定义

      ‐‐[[ 函数返回两个值的最大值 ‐‐]]
      function max(num1, num2)
      if (num1 > num2) then
      result = num1;
      else
      result = num2;
      end
      return result;
      end
      ‐‐ 调用函数
      print("两值比较最大值为 ",max(10,4))
      print("两值比较最大值为 ",max(5,6))
      
    • 导入其它函数库

      require "<模块名>"
      

Nginx

  • 负载均衡
    • 轮询(加权)
    • IP Hash
  • 反向代理
  • 静态资源服务器

OpenResty

  • 集成了Nginx+lua
  • 对nginx做了优化

广告二级缓存方案

广告二级缓存方案_第3张图片

分解预加载代码【了解】

  • 请求URL的解析

    local uri_args = ngx.req.get_uri_args();
    local position = uri_args["position"];
    
  • 连接mysql获取增量更新的缓存数据

    local mysql = require("resty.mysql")
    
    local db = mysql:new()
    db:set_timeout(1000)  
    local props = {  
        host = "192.168.200.128",  
        port = 3306,  
        database = "changgou_business",  
        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()  
    
  • 存储增量数据到redis中

    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()
    
  • Nginx中配置URI

    • nginx -s reload
    location /ad_update {
    	content_by_lua_file /root/lua/ad_update.lua;
    }
    

NgxinLua读取二级缓存示例【熟悉】

ngx.header.content_type="application/json;charset=utf8"
local uri_args = ngx.req.get_uri_args();
local position = uri_args["position"];
local cache_ngx = ngx.shared.dis_cache;
local adCache = cache_ngx:get('ad_cache_'..position);
if adCache == "" or adCache == nil then
local redis = require("resty.redis");
local red = redis:new()
red:set_timeout(2000)
local ok, err = red:connect("192.168.200.128", 6379)
local rescontent=red:get("ad_"..position)
ngx.say(rescontent)
red:close()
cache_ngx:set('ad_cache_'..position, rescontent, 10*60);
else
ngx.say(adCache)
end

Nginx的漏桶限流【熟悉】

  • 配置限流策略

    # binary_remote_addr 是客户端IP进行分桶
    # zone=myRateLimit:10m  设置策略名称,并设置所有桶的总大小是10m
    # rate=2r/s  设置令牌从桶中流出的速度
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;
    
  • 配置限流的请求

    # 在location中配置限流生效
    limit_req zone=myRateLimit burst=5 nodelay;
    

    设置令牌从桶中流出的速度
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;

    
    
  • 配置限流的请求

    # 在location中配置限流生效
    limit_req zone=myRateLimit burst=5 nodelay;
    

你可能感兴趣的:(广告二级缓存方案)