废话少说,直接上干货
Dino开始说:
用到的4个工具:这里不讲Lua 和 OpenResty
- OpenResty
- Lua
- Redis
- Mysql
Lua+Redis+OpenResty+Mysql
在高并发的环境下 ,网站的首页,是访问最高的地方,如果不实施高并发的缓存操作,服务的一系列问题会暴漏的淋漓尽致
缓存的预热(Lua实现脚本操作来进行 数据的传输)
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(1000)
local props = {
host = "192.168.xxx.xxx",
port = 3306,
database = "xxxxxxxx",
user = "root",
password = "xxxx"
}
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.xxxx.xxx"
local port = 6379
red:connect(ip,port)
red:set("ad_"..position,cjson.encode(res))
red:close()
ngx.say("{flag:true}")
缓存的三级操作
一:发送请求到达OpenResty(自带nginx)
二:查看nginx_cache 是否有缓存,如果有则返回
三: nginx_cache 没有,通过Lua来进行访问Redis 中是否有缓存
四: 看Redis中是否有缓存,如果有缓存的话,会将数据通过Lua脚本 将数据保存在nginx_cache中
五: Redis 没有,通过Lua脚本进行Mysql查询
六: 查看Mysql ,将数据通过Lua脚本 将数据保存在Redis中去,进而保存在nginx_cache中去。
这里提供一下Lua脚本:
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.xxxx.xxx", 6379)
local rescontent=red:get("ad_"..position)
if rescontext =="" or rescontext ==nil then
//如果没有数据 则需要查数据库
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(1000)
local props = {
host = "192.168.xxxx.xxx",
port = 3306,
database = "xxxxx",
user = "root",
password = "rxxt"
}
local rescontext = 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()"
rescontext = db:query(select_sql)
db:close()
else //这里使将从数据库查到的数据保存在 Redis中去
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)
local ip ="192.168.xxxx.xx"
local port = 6379
red:connect(ip,port)
red:set("ad_"..position,cjson.encode(rescontext ))
red:close()
ngx.say("{flag:true}")
else
ngx.say(adCache)
end