2020-07-21

#### nginx缓存预热与读取

##### 缓存预热


首先,连接mysql ,按照广告分类ID读取广告列表,转换为json字符串

然后,连接redis,将广告列表json字符串存入redis 。

请求:

  /ad_update

参数:

  position  ‐‐指定广告位置

返回值:

  json

在/root/lua目录下创建ad_load.lua ,实现连接mysql 查询数据 并存储到redis中

```lua

ngx.header.content_type="application/json;charset=utf8"

local cjson = require("cjson")  #获取请求Json数据

local mysql = require("resty.mysql")  #获取mysql数据库连接对象

local uri_args = ngx.req.get_uri_args()  #获取uri的参数

local position = uri_args["position"]  #获取参数中的position字段

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()"  #定义sql语句

res = db:query(select_sql)  #执行查询

db:close()  #关闭数据库连接

local redis = require("resty.redis")  #获取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))  #将数据缓存到redis中

red:close()  #关闭redis

ngx.say("{flag:true}")  #响应客户端

```

修改/usr/local/openresty/nginx/conf/nginx.conf文件:

代码如下:

```

  #user  nobody;

user root root;

worker_processes  1;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet‐stream;

    sendfile        on;

    #tcp_nopush     on;

    #keepalive_timeout  0;

    keepalive_timeout  65;

    #gzip  on;

    server {

        listen       80;

        server_name  localhost;

        charset utf‐8;

        #access_log  logs/host.access.log  main;

        # 添加

        location /ad_update {  #关联请求路径和lua脚本路径

            content_by_lua_file /root/lua/ad_update.lua;

        }


        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

          }       

    }

}

```

重新启动 nginx

测试:http://192.168.200.128/ad_update?position=web_index_lb

##### 广告缓存读取

实现思路:

通过lua脚本直接从redis中获取数据即可

定义请求:

请求 :/ad_read

参数:position

返回值:json

在/root/lua目录下创建ad_read.lua

```lua

ngx.header.content_type="application/json;charset=utf8"

local uri_args = ngx.req.get_uri_args();  #获取uri参数

local position = uri_args["position"];  #获取参数中position字段

local redis = require("resty.redis");

local red = redis:new()

red:set_timeout(2000)

local ok, err = red:connect("192.168.200.128", 6379) #连接redis

local rescontent=red:get("ad_"..position)

ngx.say(rescontent)

red:close()

```

在 /usr/local/openresty/nginx/conf/nginx.conf中server下添加配置

```

location /ad_read {    #关联请求路径和lua脚本路径

  content_by_lua_file /root/lua/ad_read.lua;

}

```

测试 http://192.168.200.128/ad_read?position=web_index_lb 输出

```json

[{"url":"img\/banner1.jpg","image":"img\/banner1.jpg"},

{"url":"img\/banner2.jpg","image":"img\/banner2.jpg"}]

```

#### 二级缓存-加入openresty本地缓存

流程示意图:


如上的方式没有问题,但是如果请求都到redis,redis压力也很大,所以我们一般采用多

级缓存的方式来减少下游系统的服务压力。

先查询openresty本地缓存 如果没有再查询redis中的数据

**openresty中自带了nginx,所以安装了openresty后直接使用里面的nginx就能使用openresty本地缓存**

修改 /root/lua目录下ad_read文件, 内容如下:

```lua

ngx.header.content_type="application/json;charset=utf8"

local uri_args = ngx.req.get_uri_args();

local position = uri_args["position"];  #获取请求参数中position

local cache_ngx = ngx.shared.dis_cache; #获取本地缓存(openresty)

#从本地缓存openresty中获取position

local adCache = cache_ngx:get('ad_cache_'..position);

#如果获取的数据是空的,那么就去redis中获取

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()    

    #然后将从redis中获取的数据再缓存到本地缓存openresty中

cache_ngx:set('ad_cache_'..position, rescontent, 10*60);    

else

  ngx.say(adCache)   

end

```

修改 nginx配置文件vi /usr/local/openresty/nginx/conf/nginx.conf ,http节点下添加配置 :

```lua

#包含redis初始化模块

lua_shared_dict dis_cache 5m;  #共享内存开启

```

具体位置如下:


#### 前端页面实现(了解)

修改index.html,编写脚本

加一段JS代码:

```html

```

在页面上添加

```html

 ... 

```

修改index.html,渲染广告轮播图

```html

class="sui‐carousel slide">

   

for="item in ad.web_index_lb">


   

   

       

           

           

          

              

   

left">‹


right">›


```

上传至服务器并测试

更改

```html

# 加载首页

        location / {

            root   html;

            index  index.html index.htm;

        }

```

你可能感兴趣的:(2020-07-21)