Redis从入门到精通(十九)多级缓存(四)Nginx共享字典实现本地缓存

文章目录

    • 前言
    • 6.5 实现多级缓存
      • 6.5.6 Nginx本地缓存
        • 6.5.6.1 代码实现
        • 6.5.6.2 功能测试
    • 6.6 缓存同步
      • 6.6.1 缓存同步策略
      • 6.6.2 异步通知策略

前言

Redis多级缓存系列文章:

Redis从入门到精通(十六)多级缓存(一)Caffeine、JVM进程缓存
Redis从入门到精通(十七)多级缓存(二)Lua语言入门、OpenResty集群的安装与使用
Redis从入门到精通(十八)多级缓存(三)OpenResty请求参数处理、Lua脚本查询Redis和Tomcat

6.5 实现多级缓存

6.5.6 Nginx本地缓存

经过前面两节的开发,整个多级缓存只差最后一环,就是Nginx本地缓存,如图:

OpenResty为Nginx提供了共享字典的功能,用于在Nginx的多个worker之间共享数据,实现缓存功能。

6.5.6.1 代码实现

要开启共享字典,需要在nginx.conf文件的http块下添加配置:

# 共享字典,也就是本地缓存,名称叫做:item_cache,大小150m
lua_shared_dict item_cache 150m;

然后修改/usr/local/openresty/nginx/lua/item.lua文件,实现Nginx本地缓存查询:

...-- 导入共享词典
local item_cache = ngx.shared.item_cache-- 封装函数,查询Redis数据
function read_data(key, expire, path, params) -- 查询本地缓存local val = item_cache:get(key)if not val thenngx.log(ngx.ERR, "[本地缓存查询失败,尝试查询Redis,", key, "]")-- 查询Redisval = read_redis("192.168.146.128", 6379, key)if not val thenngx.log(ngx.ERR, "[Redis查询失败,尝试查询HTTP," .. key .. "]")-- Redis查询失败,去查询HTTPval = read_http(path, params)elsengx.log(ngx.ERR, "[Redis查询成功," .. key .. "]")endif val then-- 查询成功,把数据写入本地缓存item_cache:set(key, val, expire)ngx.log(ngx.ERR, "[保存本地缓存成功,", key, "]")endelsengx.log(ngx.ERR, "[本地缓存查询成功,", key, "]")endreturn val
end...-- 3.根据ID发起请求查询商品信息
local itemJSON = read_data("item:id:" .. id, 1800, "/dzdp/item/" .. id, nil)
ngx.log(ngx.ERR, "[查询商品信息结果: " .. itemJSON .. "]")
-- 4.根据ID发起请求查询商品库存信息
local itemStockJSON = read_data("item:stock:" .. id, 60, "/dzdp/item/stock/" .. id, nil)...

修改后,item.lua文件的逻辑是:先查询Nginx本地缓存,查到结果直接返回,未查到结果再去查Redis缓存;Redis查到结果,则将结果写入Nginx本地缓存后返回,否则再去查Tomcat;Tomcat查到结果,则将结果写入Nginx本地缓存后返回,未查到结果则最终返回空。

还需要注意的是,read_data函数新增了一个expire参数,即过期时间,过期后Nginx缓存会自动删除,下次访问时会再次更新缓存。这里给商品信息设置超时时间为30分钟,库存信息为1分钟,因为库存更新频率较高。

6.5.6.2 功能测试

在页面发起请求ID=2的商品信息,会查询Nginx本地缓存失败,然后去Redis中查询:

再次在页面发起请求ID=2的商品信息,由于上一次已经将商品信息保存到了Nginx本地缓存,因此这次会直接查询Nginx本地缓存成功并返回:

至此,多级缓存已全部实现。

6.6 缓存同步

大多数情况下,浏览器查到的都是缓存数据,在多级缓存架构中必须要求缓存数据和数据库数据不存在较大差异,即必须保证缓存数据和数据库数据的一致性。

6.6.1 缓存同步策略

缓存数据同步的常见策略有三种:

1)设置有效期:给缓存设置有效期,到期后自动删除,再次查询时更新

  • 优势:简单、方便
  • 缺点:时效性差,缓存过期之前可能不一致
  • 场景:更新频率较低,时效性要求低的业务

2)同步双写:在修改数据库的同时,直接修改缓存

  • 优势:时效性强,缓存与数据库强一致
  • 缺点:有代码侵入,耦合度高;
  • 场景:对一致性、时效性要求较高的缓存数据

3)异步通知:修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据

  • 优势:低耦合,可以同时通知多个缓存服务
  • 缺点:时效性一般,可能存在中间不一致状态
  • 场景:时效性要求一般,有多个服务需要同步

6.6.2 异步通知策略

异步通知又可以基于MQ或者Canal来实现:

1)基于MQ

基于MQ时,商品服务完成对数据的修改后,只需要发送一条消息到MQ中。缓存服务监听MQ消息,然后完成对缓存的更新。但依然有少量的代码侵入。

2)基于Canal

基于Canal时,商品服务完成商品修改后,业务直接结束,代码零侵入;Canal监听MySQL变化,当发现变化后,立即通知缓存服务;缓存服务接收到canal通知,更新缓存。

Canal,译意为水道/管道/沟渠,是阿里巴巴旗下的一款开源项目,基于Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。GitHub的地址:https://github.com/alibaba/canal

Canal是基于MySQK的主从同步来实现的,MySQL主从同步的原理如下:

  • 1)MySQL master 将数据变更写入二进制日志( binary log),其中记录的数据叫做 binary log events。
  • 2)MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)。
  • 3)MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据。

而Canal就是把自己伪装成MySQL的一个slave节点,从而监听master的binary log变化,再把得到的变化信息通知给Canal的客户端,进而完成对其它数据库的同步。

本章完,多级缓存的内容结束。

本章所涉及的代码和资源可从git仓库下载:https://gitee.com/weidag/redis_learning.git

更多内容请查阅分类专栏:Redis从入门到精通

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析(已完结)
  • MyBatis3源码深度解析(已完结)
  • 再探Java为面试赋能(持续更新中…)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/311738.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05节-51单片机-模块化编程

1.两种编程方式的对比 传统方式编程: 所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路 模块化编程: 把各个模块的代码放在不同的…

数字革命的先锋:Web3对社会的影响

引言 在信息技术飞速发展的当下,Web3作为一个新兴的互联网模式,正在逐渐改变我们的生活方式、商业模式和社会结构。本文将深入探讨Web3的核心特点、它在各个领域中的应用以及对社会产生的深远影响。 1. Web3的核心特点 1.1 去中心化 Web3强调去中心化…

Day 27 39. 组合总和 40.组合总和II 131.分割回文串

组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。解集不能…

stm32实现hid键盘

前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客https://blog.csdn.net/anlog/article/details/137814494?spm1001.2014.3001.5502两个项目的配置完全相同。 代码 引用 键盘代码: 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定…

Shell循环以及条件语句使用

Shell脚本基础已经发过,可在主页查找,现在讲解case,for,while语句,以及语句的练习。 1.case语句 等同于C语⾔的switch-case 格式: case $变量 in # 判断变量的值 a) # 值是什么语句;; # 相当于break 但…

机器学习和深度学习的区别

机器学习与深度学习的区别 一、原理差异二、应用差异三、实现方式差异四、在实际应用中扮演的角色1、图像识别和计算机视觉2、自然语言处理NLP3、语音识别领域4、其它—智能制造/医疗健康/金融/教育 五、总结 在人工智能领域,机器学习和深度学习是两个重要的概念&am…

『FPGA通信接口』串行通信接口-SPI

文章目录 1.SPI简介2.控制时序3.Dual、Qual模式4.例程设计与代码解读5.SPI接口实战应用5.1时序要求5.2仿真时序图5.3代码设计 6.传送门 1.SPI简介 SPI是串行外设接口(Serial Peripheral Interface)的缩写,通常说SPI接口或SPI协议都是指SPI这…

多模态之ALBEF—先对齐后融合,利用动量蒸馏学习视觉语言模型表征,学习细节理解与论文详细阅读:Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation (ALBEF)在融合之前对齐:利用动量蒸馏进行视觉与语言表示学习 Paper: arxiv.org/pdf/2107.07651.pdf Github: https://github.com/salesforce/…

NineData正式将SQL开发正式升级为数据库DevOps

NineData SQL 开发早期主要提供 SQL 窗口(IDE)功能,产品经过将近两年时间的打磨,新增了大量的企业级功能,时至今日已经服务了上万开发者,覆盖了数据库设计、开发、测试、变更等生命周期的功能。 为了让企业…

Vue3 + Element-Plus 使用 Table 预览图片发生元素遮挡

Vue3 Element-Plus 使用 Table 预览图片发生元素遮挡 问题代码问题重现解决方法最终效果 问题代码 <el-table-column label"视频" align"center"><template #default"scope" style"display: flex;"><div style"…

Prime (2021): 2

前言 这个靶机有亿点难,收获很多。打靶的时候&#xff0c;前面很顺&#xff0c;到创建ssh公钥之后就一点不会了。 1 01 arp扫描&#xff0c;发现有一个130&#xff0c;再查看端口 有22&#xff0c;80&#xff0c;129&#xff0c;445&#xff0c;10123 dirb扫描目录 这…

【Git】安装 Git

文章目录 1. CentOS 下安装2. Ubuntu 下安装 Git 是开放源代码的代码托管工具&#xff0c;最早是在 Linux 下开发的。开始也只能应用于 Linux 平台&#xff0c;后面慢慢的被移植到 Windows 下。现在&#xff0c;Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常运行了…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序&#xff0c;可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项&#xff1a; 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件&#xff0c;这样整个窗口就成了包含 textBrower 的单文…

Samtec应用分享 | 汽车应用中的视觉系统

【前言】 视觉系统在未来的汽车设计中扮演着关键的角色。 在过去&#xff0c;一直是由驾驶员掌握和应对道路上的危险&#xff0c;但现代车辆在保障驾驶安全方面发挥着前所未有的作用。 视觉系统&#xff0c;无论是可见光摄像头还是先进的探测系统&#xff0c;如激光雷达&…

解读科技智慧公厕改变生活的革命性创新之路

公共厕所&#xff0c;作为城市基础设施的一部分&#xff0c;一直以来都备受人们诟病。脏乱差、设施老旧、管理混乱&#xff0c;成为公共厕所长期存在的问题。然而&#xff0c;随着科技的不断进步&#xff0c;智慧公厕应运而生&#xff0c;为解决公厕难题&#xff0c;智慧公厕源…

CentOS 7开机启动过程,引导和服务,密码的修改

开机启动过程&#xff1a; 引导过程&#xff1a;1.开机自检(BIOS)->2.MBR引导->GRUB菜单->加载内核kernel->systemd进程初始化 程序&#xff1a;执行特定任务的一串代码&#xff0c;静态&#xff0c;存在硬盘中。 进程&#xff1a;运行中的程序叫进程&#xff0…

分类损失函数与评估指标

目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 1.7 PRC曲线的优势 2 损失函数 1. 负对数似然损失 2. 交叉熵损失 3. 指数损失 3 分类问题为什么用交叉熵损失不用 MSE 损失 1 评估指标 混淆矩阵 TP(True Positive) ---- 正…

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸?

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸? 如下图所示,我们打开一份DWG格式的图纸文件,然后点击上方的“打印“图标, 如下图所示, 打印机/绘图仪这里选择“DWG To PDF“; 图纸尺寸:这里以普通的A4纸为例进行说明; 打印比例选择“布满图纸“; 打印偏移…

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…

公园高速公路景区校园IP网络广播音柱SIP音柱

公园高速公路景区校园IP网络广播音柱SIP音柱 适用于学校、车站、教堂、工厂、仓库、公园停车场及露天市场高速公路等场所播放录制语音文件或背景音乐节目&#xff0c;专业一体化音箱设计&#xff0c;高强度防水设计&#xff0c;符合IP54防护等认证&#xff0c;数字化产品&…