携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
每日英语:
An optimist is one who imagines that the future is uncertain.
翻译:乐观主义者就是想象未来的不确定性的人。 -维克多·谢尔比列
1. 多级缓存 Lua+Redis
根据上面分析的多级缓存架构,我们可以在每次在使用到Nginx的时候,用lua脚本操作redis,如果redis中有数据,则将数据写入到Nginx缓存中,再将数据响应给用户,接下来,我们来实现一下用Lua脚本将数据从redis中加载出来。
在/usr/local/openresty/nginx/lua中创建文件aditemsskus.lua,脚本如下:
--1.先声明数据响应类型JSON,这个跟python有点儿类似
ngx.header.content_type="application/json;charset=utf8"
--2.引入Redis的库依赖
local redis = require("resty.redis");
local cjson = require("cjson");
--3.获取id参数(type),也就是我们请求中的id参数
local id = ngx.req.get_uri_args()["id"];
--4.key组装
local key = "ad-items-skus::"..id
--5.创建链接对象
local red = redis:new()
--6.设置超时时间
red:set_timeout(2000)
--7.设置服务器链接信息
red:connect("127.0.0.1", 6379)
--8.查询指定key的数据
local result=red:get(key);
--9.关闭Redis链接
red:close()
--10.对返回的数据进行判断,不为空的话,返回正常数据
if result==nil or result==null or result==ngx.null then
return true
else
--输出数据
ngx.say(result)
end
修改nginx.conf添加如下配置:
#推广产品查询多级缓存redis
location /sku/aditems/type {
content_by_lua_file /usr/local/openresty/nginx/lua/aditemsskus.lua;
}
访问http://www.xzshop.com/sku/aditems/type?id=1,就可以看到对样的缓存了。
2.Nginx代理缓存学习
proxy_cache 是用于 proxy 模式的缓存功能,proxy_cache 在 Nginx 配置的 http 段、server 段中分别写入不同的配置。http 段中的配置用于定义 proxy_cache 空间,server 段中的配置用于调用 http 段中的定义,启用对server 的缓存功能。
使用:
1、定义缓存空间
2、在指定地方使用定义的缓存
1)开启Proxy_Cache缓存:
需要在nginx.conf中配置才能开启缓存:
proxy_cache_path /usr/local/openresty/nginx/cache levels=1:2
keys_zone=proxy_cache:10m max_size=1g inactive=60m use_temp_path=off;
参数说明:
【proxy_cache_path】指定缓存存储的路径,缓存存储在/usr/local/openresty/nginx/cache目录
【levels=1:2】设置一个两级目录层次结构存储缓存,在单个目录中包含大量文件会降低文件访问速度,因此我们建议对大多数部署使用两级目录层次结构。如果 levels 未包含该参数,Nginx 会将所有文件放在同一目录中。
【keys_zone=proxy_cache:10m】设置共享内存区域,用于存储缓存键和元数据,例如使用计时器。拥有内存中的密钥副本,Nginx 可以快速确定请求是否是一个 HIT 或 MISS 不必转到磁盘,从而大大加快了检查速度。1 MB 区域可以存储大约 8,000 个密钥的数据,因此示例中配置的 10 MB 区域可以存储大约 80,000 个密钥的数据。
【max_size=1g】设置缓存大小的上限。它是可选的; 不指定值允许缓存增长以使用所有可用磁盘空间。当缓存大小达到限制时,一个称为缓存管理器的进程将删除最近最少使用的缓存,将大小恢复到限制之下的文件。
【inactive=60m】指定项目在未被访问的情况下可以保留在缓存中的时间长度。在此示例中,缓存管理器进程会自动从缓存中删除 60 分钟未请求的文件,无论其是否已过期。默认值为 10 分钟(10m)。非活动内容与过期内容不同。Nginx 不会自动删除缓存 header 定义为已过期内容(例如 Cache-Control:max-age=120)。过期(陈旧)内容仅在指定时间内未被访问时被删除。访问过期内容时,Nginx 会从原始服务器刷新它并重置 inactive 计时器。
【use_temp_path=off】表示NGINX会将临时文件保存在缓存数据的同一目录中。这是为了避免在更新缓存时,磁盘之间互相复制响应数据,我们一般关闭该功能。
2)Proxy_Cache属性:
proxy_cache:设置是否开启对后端响应的缓存,如果开启的话,参数值就是zone的名称,比如:proxy_cache。
proxy_cache_valid:针对不同的response code设定不同的缓存时间,如果不设置code,默认为200,301,302,也可以用any指定所有code。
proxy_cache_min_uses:指定在多少次请求之后才缓存响应内容,这里表示将缓存内容写入到磁盘。
proxy_cache_lock:默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存有数据要么限时等待锁释放;nginx 1.1.12才开始有。
配套着proxy_cache_lock_timeout一起使用。
proxy_cache_key:缓存文件的唯一key,可以根据它实现对缓存文件的清理操作。
总结:本篇主要介绍了一下多级缓存Lua+Redis的用法,还有Nginx代理缓存学习。