微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
多级缓存
文章目录
- 微服务框架
- 多级缓存
- 48 多级缓存
- 48.9 Nginx 本地缓存
- 48.9.1 Nginx本地缓存需求
- 48.9.2 Nginx 本地缓存
48 多级缓存
48.9 Nginx 本地缓存
48.9.1 Nginx本地缓存需求
我淦,走到这儿真不容易
OK,我们又完成 了添加Redis 缓存的需求
现在就差最后一个,在OpenResty 中添加本地缓存了
现在想要实现的效果就是 请求进入 OpenResty 后,优先查询本地缓存,本地缓存未命中去查Redis,Redis 未命中,再去查Tomcat
48.9.2 Nginx 本地缓存
OpenResty为Nginx提供了shard dict的功能,可以在nginx的多个worker之间共享数据,实现缓存功能。
- 开启共享字典,在nginx.conf的http下添加配置:
直接干
# 共享字典,也就是本地缓存,名称叫做:item_cache,大小150m
lua_shared_dict item_cache 150m;
OK
- 操作共享字典:
修改item.lua
-- 导入共享词典,本地缓存
local item_cache = ngx.shared.item_cache
OK,来个案例
【案例】在查询商品时,优先查询OpenResty的本地缓存
需求:
- 修改item.lua中的read_data函数,优先查询本地缓存,未命中时再查询Redis、Tomcat
- 查询Redis或Tomcat成功后,将数据写入本地缓存,并设置有效期
- 商品基本信息,有效期30分钟
- 库存信息,有效期1分钟
修改item.lua
-- 导入common 函数库
local common = require('common')
local read_http = common.read_http
local read_redis = common.read_redis
-- 导入cjson 库
local cjson = require('cjson')
-- 导入共享词典,本地缓存
local item_cache = ngx.shared.item_cache
-- 封装查询函数
function read_data(key ,expire, path, params)
-- 查询本地缓存
local val = item_cache:get(key)
if not val then
ngx.log("本地缓存查询失败,尝试查询Redis ,key : " , key)
-- 查询Redis
val = read_redis("1.13.92.88", 6379, key)
-- 判断查询结果
if not val then
ngx.log("redis查询失败,尝试查询http,key : " , key)
-- redis 查询失败,去查询http
val = read_http(path , params)
end
end
-- 查询成功,把数据写入本地缓存
item_cache:set(key , val , expire)
-- 返回数据
return val
end
-- 获取路径参数
local id = ngx.var[1]
-- 有缓存
-- 查询商品信息
local itemJSON = read_data("item:id:" .. id, 1800, "/item/" .. id,nil)
-- 查询库存信息
local stockJSON = read_data("item:stock:id:" .. id, 60, "/item/stock/" .. id , nil)
-- 没加缓存
-- -- 查询商品信息
-- local itemJSON = read_http("/item/" .. id,nil)
-- -- 查询库存信息
-- local stockJSON = read_http("/item/stock/" .. id , nil)
-- JSON 转化为lua 的table
local item = cjson.decode(itemJSON)
local stock = cjson.decode(stockJSON)
-- 组合数据
item.stock = stock.stock
item.sold = stock.sold
-- -- 返回结果
-- ngx.say(itemJSON)
-- 把item 序列化为json,返回结果
ngx.say(cjson.encode(item))
重新加载 Nginx 配置
查看日志
tail -f logs/error.log
OK就这样放着
浏览器刷新
报错了,查看日志
log 函数有问题
OK,加上之后再来一次
重新加载
打开日志
再试一次
这次成功 过来 了
看看日志
OK,一次查商品,一次查库存
再来一次
没毛病
现在就算我把redis 中 10003 的缓存删除
再次访问 10003
也不会有去查 10003 数据的日志,因为Nginx 的本地缓存中已经有 10003 的数据 了
OK, 这就是Nginx 本地缓存的实现了 【黑马牛逼!!!!!!!!!】