缓存在内存中,提高程序性能!
程序中可以做缓存的技术有很多,加在以前就叫 多级缓存** 而且不同的缓存技术存在,在不同的地方..实现不同的功能!
当然本章并不会讲解这么多,而是抽出几个来:
nginx redis @Ehcache JVM缓存模板渲染
lua-resty-template
可以渲染很复杂的页面,借助LuaJIT其性能也是可以接受的。伪静态页面。
**更利于排名
你可以去观察那些大型的门户网站,比如新浪、阿里巴巴、百度等页面大多采用静态或伪静态页面来显示,可想而知,这足够说明了静态化带给网站很大好处。静态页面会使网站更加稳定,增加网站的信任度。
这里是 redis 和 Ehcache的Java代码缓存方式:**不细致讲解
**可以了解:点击
当然主要是 lua ...
info.lua
-- 中文转码
ngx.header.content_type="text/html;charset=utf8"
-- 获取url 参数
local uri_args = ngx.req.get_uri_args()
local goodsId = uri_args["goodsId"]
-- 打印日志
ngx.log(ngx.ERR,"json------",goodsId)
local cache_ngx = ngx.shared.my_cache -- nginx 缓存模板对象
local goodsCacheKey = "goods:"..goodsId -- 设置key
local goodsCache = cache_ngx:get(goodsCacheKey) -- 根据get(key); 获取缓存中数据!
-- 判断是否存在数据 “” 或 nil 就发送请求....
if goodsCache == "" or goodsCache == nil then
local http = require("resty.http")
local httpc = http.new()
local resp, err = httpc:request_uri("http://127.0.0.1:6001",{
method = "GET",
path = "/showinfo/"..goodsId
})
-- 获取结果
goodsCache = resp.body
-- 设置缓存时间
local expireTime = math.random(600,1200)
-- set(key,value); 设置缓存
cache_ngx:set(goodsCacheKey,goodsCache,expireTime)
end
-- 日志输出
ngx.log(ngx.ERR,"json------",goodsCache)
-- 获取到JSON 模板!
local cjson = require("cjson")
local goodsCacheJSON = cjson.decode(goodsCache) -- 结果数据转换成JSON
-- 响应参数封装 context
local context = {
goodsname = goodsCacheJSON.spu.name,
img = goodsCacheJSON.spu.images,
introduction = goodsCacheJSON.spu.introduction,
specItems = goodsCacheJSON.spu.specItems
}
-- 获取模板对象。
local template = require("resty.template")
template.render("item.html", context) -- context 传入指定模板静态页面!
local cache_ngx = ngx.shared.my_cache -- nginx 缓存模板对象
local goodsCache = cache_ngx:get(goodsCacheKey) -- 根据get(key); 获取缓存中数据!
-- 判断是否存在数据 “” 或 nil 就发送请求....
if goodsCache == "" or goodsCache == nil then
-- 请求数据通过set方法,根据指定key 设置缓存/缓存时间(建议随机预防 缓存雪崩!)
-- 设置缓存时间
local expireTime = math.random(600,1200)
-- set(key,value); 设置缓存
cache_ngx:set(goodsCacheKey,goodsCache,expireTime)
end
ok。以上就是nginx 设置缓存的基本结构语法… 总的来说并不难!
nginx lua 通过:lua-resty-template实现**大体内容有:
**
set指令定义
template_location、template_root 或者使用 root指令定义的位置加载
nginx执行的配置文件:**指定该请求下的模板位置
**
lua.conf
#给nginx 分内存 128m 兆 缓存大小!用于存放热点数据(频繁使用的数据!)
lua_shared_dict my_cache 128m;
#nginx服务
server {
listen 9090; #指定端口9090,默认80
server_name _;
#静态资源管理模板地址...
set $template_location "/templates";
set $template_root "D:/WSMwork/www/templates";
root D:/WSMwork/www/templates; # "指定要导入的模板路径!"
#注意这里不能设置 中文地址!
location /info{
default_type text/html;
content_by_lua_file D:/WSMwork/www/info.lua;
}
}
加载顺序
ngx.location.capture从template_location
查找,如果找到(状态为为200)则使用该内容作为模板;
此种方式是一种动态获取模板方式;
这时候,静态数据就已将放在了nginx服务器中,启动运行…
当然对于静态的 html css Js...一些文件进行配置!注意html文件中引入的外部样式路劲进行更改!
-- 获取到JSON 模板!
local cjson = require("cjson")
local goodsCacheJSON = cjson.decode(goodsCache) -- 返回结果数据转换成JSON
-- 响应参数封装 context
local context = {
goodsname = goodsCacheJSON.spu.name,
img = goodsCacheJSON.spu.images,
introduction = goodsCacheJSON.spu.introduction,
specItems = goodsCacheJSON.spu.specItems
}
-- 获取模板对象。
local template = require("resty.template")
--是否缓存解析后的模板,默认true
template.caching(true)
template.render("item.html", context) -- context 传入指定模板静态页面!
{* 变量名 *}
页面中输出值!lua脚本
info1.lua
-- 中文转码
ngx.header.content_type="text/html;charset=utf8"
local template = require("resty.template")
local context = {
title = "测试",
name = "张三",
description = "<script>alert(1);</script>",
age = 20,
hobby = {"电影", "音乐", "阅读"},
score = {语文 = 90, 数学 = 80, 英语 = 70},
score2 = {
{name = "语文", score = 90},
{name = "数学", score = 80},
{name = "英语", score = 70},
}
}
template.render("t3.html", context)
静态页面:
lua.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1> nginx页面静态化 </h1>
{# 不转义变量输出 #}
姓名:{* string.upper(name) *}<br/>
{# 不转义输出,html形式输出,JS CSS 格式数据会成立! #}
{* description *}
{# 转义变量输出,已文本形式输出... #}
简介:{{description}}<br/>
{# 可以做一些运算 #}
年龄: {* age + 1 *}<br/>
{# 循环输出 #}
爱好:
{% for i, v in ipairs(hobby) do %}
{% if i > 1 then %},{% end %}
{* v *}
{% end %}<br/>
成绩:
{% local i = 1; %}
{% for k, v in pairs(score) do %}
{% if i > 1 then %},{% end %}
{* k *} = {* v *}
{% i = i + 1 %}
{% end %}<br/>
成绩2:
{% for i = 1, #score2 do local t = score2[i] %}
{% if i > 1 then %},{% end %}
{* t.name *} = {* t.score *}
{% end %}<br/>
{# 中间内容不解析 #}
{-raw-}{(file)}{-raw-}
{# 引入外部文件 #}
{(lua2.html)}
</body>
</html>
lua2.html
<h1> 引入外部lua2.html 代码</h1>
{(include_file)}
:包含另一个模板文件,相当于引入外部的 html 代码片段;{* var *}
:变量输出;{{ var }}
:变量转义输出, 不已以html 语法进行转义输出,可以使用 JS CSS等标签…{% code %}
:lua代码片段;{# comment #}
:注释;{-raw-}
中间的内容不会解析,作为纯文本输出;nginx配置文件
lua.conf
添加
location /info1{
default_type text/html;
content_by_lua_file D:/WSMwork/www/info1.lua;
}