微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存

微服务框架

【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 缓存的需求

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第1张图片

现在就差最后一个,在OpenResty 中添加本地缓存了

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第2张图片

现在想要实现的效果就是 请求进入 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; 

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第3张图片

OK

  • 操作共享字典:

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第4张图片

修改item.lua

-- 导入共享词典,本地缓存
local item_cache = ngx.shared.item_cache

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第5张图片

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就这样放着

浏览器刷新

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第6张图片

报错了,查看日志

log 函数有问题

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第7张图片

OK,加上之后再来一次

重新加载

在这里插入图片描述

打开日志

再试一次

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第8张图片

这次成功 过来 了

看看日志

OK,一次查商品,一次查库存

再来一次

没毛病

现在就算我把redis 中 10003 的缓存删除

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存_第9张图片

再次访问 10003

也不会有去查 10003 数据的日志,因为Nginx 的本地缓存中已经有 10003 的数据 了

OK, 这就是Nginx 本地缓存的实现了 【黑马牛逼!!!!!!!!!】

你可能感兴趣的:(微服务,架构,微服务,spring,cloud)