OpenResty+Redis+Mysql+Lua实现多级缓存(浏览器版)

蚊子 2023年03月10日 369次浏览

前言

本文章环境请前往:https://www.0po.cn/archives/30

意义:浏览器运行lua文件,实现多级缓存
多级缓存:Nginx-Redis-Mysql

简说:Nginx先自已找,没找到去Redis找数据,Redis没找到去Mysql找,Mysql找到返回Redis。
下次Nginx没找到去Redis找,然后存入Nginx,但网页返回的是Redis的。
再下次,Nginx就自已找到了,Nginx本身似乎只存1分钟


一句话

Lua文件,注意看注释

ngx.header.content_type="application/json;charset=utf8"
local uri_args = ngx.req.get_uri_args()
--cid是根据id查询数据库,必须穿,不穿网页报500
local cid = uri_args['cid']
--获取nginx缓存对象
local ngxCache = ngx.shared.my_cache
--获取nginx存在缓存数据
local ngxData = ngxCache:get('content:'..cid)
if ngxData=="" or ngxData==nil then
--如果nginx没有数据,就去redis找
	local redisModel = require("resty.redis")
	local redis = redisModel.new()
	redis:set_timeout(1000)
	local ok = redis:connect('127.0.0.1',6379)
	redis:select(0)
	local redisData = redis:get("content:"..cid);
	if ngx.null==redisData then
	--如果redis没有,就去数据库查
		local mysqlModel = require("resty.mysql")
		local db = mysqlModel:new()
		db:set_timeout(1000)
		--database表名,user数据库账号,password数据库密码
		local ok = db:connect{
			host="127.0.0.1",
			port=3306,
			database="shop_content",
			user="root",
			password="ok"
		}

		if not ok then
			ngx.say('链接失败')
			db:close()
			return false;
		end 
          --查询语句,根据cid查询
		res = db:query("SELECT * FROM `tb_content` WHERE category_id="..cid)

		local cjson = require("cjson")
		local jsonVal = cjson.encode(res)
		ngx.say("================>DB")
		ngx.say(jsonVal)
		--mysql查的数据放入redis中,下次查会去redis
		redis:set("content:"..cid,jsonVal)
	else
		ngx.say("================>redis")
		ngx.say(redisData)
		--存放到nginx
		ngxCache:set('content:'..cid,redisData,60)
	end 
else
	ngx.say("================>nginx")
	ngx.say(ngxData)
end