微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.8 查询Redis 缓存
创始人
2024-04-25 01:42:32

微服务框架

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

多级缓存

文章目录

      • 微服务框架
      • 多级缓存
      • 48 多级缓存
        • 48.8 查询Redis 缓存
          • 48.8.1 OpenResty的Redis模块

48 多级缓存

48.8 查询Redis 缓存

48.8.1 OpenResty的Redis模块

OpenResty提供了操作Redis的模块,我们只要引入该模块就能直接使用:【是真的强】

  • 引入Redis模块,并初始化Redis对象

在这里插入图片描述

看看目录

在这里插入图片描述

OK,就是这个,因为它不是直接放在 lualib 下

所以要加个目录名

  • 封装函数,用来释放Redis连接,其实是放入连接池

在这里插入图片描述

【读取Redis】

  • 封装函数,从Redis读数据并返回

在这里插入图片描述

编写【common.lua 】

-- 导入redis
local redis = require("resty.redis")
-- 初始化Redis对象
local red = redis:new()
-- 设置Redis超时时间
red:set_timeouts(1000, 1000, 1000)-- 关闭redis连接的工具方法,其实是放入连接池
local function close_redis(red)local pool_max_idle_time = 10000 -- 连接的空闲时间,单位是毫秒local pool_size = 100 --连接池大小local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)if not ok thenngx.log(ngx.ERR, "放入redis连接池失败: ", err)end
end-- 查询redis的方法 ip和port是redis地址,key是查询的key
local function read_redis(ip, port, key)-- 获取一个连接local ok, err = red:connect(ip, port)if not ok thenngx.log(ngx.ERR, "连接redis失败 : ", err)return nilend-- 查询redislocal resp, err = red:get(key)-- 查询失败处理if not resp thenngx.log(ngx.ERR, "查询Redis失败: ", err, ", key = " , key)end--得到的数据为空处理if resp == ngx.null thenresp = nilngx.log(ngx.ERR, "查询Redis数据为空, key = ", key)endclose_redis(red)return resp
end-- 封装函数,发送http请求,并解析响应
local function read_http(path, params)local resp = ngx.location.capture(path,{method = ngx.HTTP_GET,args = params,})if not resp then-- 记录错误信息,返回404ngx.log(ngx.ERR, "http查询失败, path: ", path , ", args: ", args)ngx.exit(404)endreturn resp.body
end
-- 将方法导出
local _M = {  read_http = read_httpread_redis = read_redis
}  
return _M

item.lua

OK,再看看案例

【案例】查询商品时,优先Redis缓存查询

需求:

  • 修改item.lua,封装一个函数read_data,实现先查询Redis,如果未命中,再查询tomcat
  • 修改item.lua,查询商品和库存时都调用read_data这个函数

在这里插入图片描述

-- 导入common 函数库
local common = require('common')
local read_http = common.read_http
local read_redis = common.read_redis-- 导入cjson 库
local cjson = require('cjson')-- 封装查询函数
function read_data(key , path, params)-- 优先查询Redislocal resp = read_redis("127.0.0.1", 6379, key)-- 判断查询结果if not resp thenngx.log("redis查询失败,尝试查询http,key : " , key)-- redis 查询失败,去查询httpresp = read_http(path , params)endreturn respend-- 获取路径参数
local id = ngx.var[1]-- 查询商品信息
local itemJSON = read_data("item:id:" .. id , "/item/" .. id,nil)-- 查询库存信息
local stockJSON = read_data("item:stock:id:" .. id ,"/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))

OK

重新加载一下

在这里插入图片描述

万事俱备

打包项目上传 到服务器上

在这里插入图片描述

跑起来

在这里插入图片描述

OK,缓存预热也做好了

直接访问浏览器

在这里插入图片描述

… 500 了

看看

【笔者又恢复到 了没加缓存的样子】

在这里插入图片描述

感觉是集群的问题

一步一步排查一下

在这里插入图片描述

卧槽!!!我这儿 少了一个逗号

我淦,我说没这句就能正常运行,有了这句就挂了

在这里插入图片描述

可以的

接下去

-- 导入common 函数库
local common = require('common')
local read_http = common.read_http
local read_redis = common.read_redis-- 导入cjson 库
local cjson = require('cjson')-- 封装查询函数
function read_data(key , path, params)-- 优先查询Redislocal resp = read_redis("1.13.92.88", 6379, key)-- 判断查询结果if not resp thenngx.log("redis查询失败,尝试查询http,key : " , key)-- redis 查询失败,去查询httpresp = read_http(path , params)endreturn resp
end-- 获取路径参数
local id = ngx.var[1]-- 有缓存
-- 查询商品信息
local itemJSON = read_data("item:id:" .. id,"/item/" .. id,nil)-- 查询库存信息
local stockJSON = read_data("item:stock:id:" .. id,"/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))

OK了

在这里插入图片描述

终于成功 了,

现在把两个Tomcat 服务器停掉

在这里插入图片描述

看看这次能不能拿到数据

在这里插入图片描述

没毛病,说明服务器停掉了也能从Redis 中获取数据!!!!

牛逼!!!!!

相关内容

热门资讯

tag是什么意思 tab是什么... 一、B端基础控件的认识控件一词,直译的话可以翻译成 “用来控制的元件”,是我们对 B 端系统进行信息...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
舌头对应五脏图 舌诊顺口溜 舌诊是非常重要的一门中医技术;更妙的是,舌诊适合普通人学习。因此从今天开始,会给大家简单介绍一些看舌...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...