多级缓存
多级缓存
1、充分利用请求处理的每个环节,分别添加缓存,减轻 Tomcat 压力,提升服务性能
(1)浏览器访问静态资源时,优先读取浏览器本地缓存
(2)访问非静态资源(ajax 查询数据)时,访问服务端
(3)请求到达 Nginx 后,优先读取 Nginx 本地缓存
(4)如果 Nginx 本地缓存未命中,则去直接查询 Redis(不经过 Tomcat)
(5)如果 Redis 查询未命中,则查询 Tomcat
(6)请求进入 Tomcat 后,优先查询 JVM 进程缓存
(7)如果 JVM 进程缓存未命中,则查询数据库
2、在多级缓存架构中,Nginx 内部需要编写本地缓存查询、Redis 查询、Tomcat 查询的业务逻辑
(1)Nginx 服务不再是一个反向代理服务器,而是一个编写业务的 Web 服务器
(2)此业务 Nginx 服务也需要搭建集群来提高并发,再有专门 Nginx 服务做反向代理
3、Tomcat 服务会部署为集群模式
4、多级缓存的关键
(1)在 Nginx 中编写业务,实现 Nginx 本地缓存、Redis、Tomcat 查询
(2)在 Tomcat 中实现 JVM 进程缓存
(3)其中 Nginx 编程则会使用 OpenResty 框架结合 Lua 语言
两类缓存
1、分布式缓存
(1)如:Redis
(2)优点:存储容量更大、可靠性更好、可以在集群间共享
(3)缺点:访问缓存有网络开销
(4)场景:缓存数据量较大、可靠性要求较高、需要在集群间共享
2、进程本地缓存
(1)如:HashMap、GuavaCache
(2)优点:读取本地内存,没有网络开销,速度更快
(3)缺点:存储容量有限、可靠性较低、无法共享
(4)场景:性能要求较高,缓存数据量较小
Caffeine
1、本地进程缓存
2、基于 Java 8 开发,提供近乎最佳命中率的高性能的本地缓存库
3、Spring 内部的缓存使用 Caffeine
4、提供三种缓存驱逐策略
(1)基于容量:设置缓存的数量上限
(2)基于时间:设置缓存的有效时间
(3)基于引用:设置缓存为软引用或弱引用,利用 GC 来回收缓存数据,性能较差,不建议使用
5、在默认情况下,当一个缓存元素过期时,Caffeine 不会自动立即将其清理、驱逐,而是在一次读或写操作后,或在空闲时间完成对失效数据的驱逐
Lua
1、一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放
2、设计目的:嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能
3、数据类型
4、变量
(1)Lua 声明变量时,并不需要指定数据类型
-- 声明字符串
local str = 'hello'
-- 字符串拼接可以使用 ..
local str2 = 'hello' .. 'world'
-- 声明数字
local num = 21
-- 声明布尔类型
local flag = true
-- 声明数组 key为索引的 table
local arr = {'java', 'python', 'lua'}
-- 声明table,类似java的map
local map = {name='Jack', age=21}
(2)访问
-- 访问数组,lua数组的角标从1开始
print(arr[1])
-- 访问table
print(map['name'])
print(map.name)
5、数组、table 都可以利用 for 循环来遍历
(1)遍历数组
-- 声明数组 key为索引的 table
local arr = {'java', 'python', 'lua'}
-- 遍历数组
for index,value in ipairs(arr) do
print(index, value)
end
(2)遍历 table
-- 声明map,也就是table
local map = {name='Jack', age=21}
-- 遍历table
for key,value in pairs(map) do
print(key, value)
end
6、定义函数
function 函数名( argument1, argument2..., argumentn)
-- 函数体
return 返回值
end
7、条件控制
(1)类似 Java
if(布尔表达式)
then
--[ 布尔表达式为 true 时执行该语句块 --]
else
--[ 布尔表达式为 false 时执行该语句块 --]
end
(2)与 Java 不同,布尔表达式中的逻辑运算基于英文单词
OpenResty
1、基于 Nginx 的高性能 Web 平台
2、方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务、动态网关
3、特点
(1)具备 Nginx 完整功能
(2)基于 Lua 语言进行扩展,集成大量 Lua 库、第三方模块
(3)允许使用 Lua 自定义业务逻辑、自定义库
4、提供各种 API 获取不同类型的请求参数
缓存同步
1、设置有效期
(1)设置缓存有效期,到期后自动删除,再次查询时更新
(2)优势:简单、方便
(3)缺点:时效性差,缓存过期之前可能不一致
(4)场景:更新频率较低,时效性要求低的业务
2、同步双写
(1)在修改数据库的同时,直接修改缓存
(2)优势:时效性强,缓存与数据库强一致
(3)缺点:有代码侵入,耦合度高
(4)场景:对一致性、时效性要求较高的缓存数据
3、异步通知
(1)修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据
(2)优势:低耦合,可以同时通知多个缓存服务
(3)缺点:时效性一般,可能存在中间不一致状态
(4)场景:时效性要求一般,有多个服务需要同步
4、基于 MQ 异步通知
5、基于 Canal 异步通知
6、Canal
(1)基于 Java 开发,基于数据库增量日志解析,提供增量数据订阅、消费,基于 MySQL 主从同步实现
(2)MySQL 主从同步原理
(3)MySQL master 将数据变更写入二进制日志(binary log),其中记录的数据叫做 binary log events
(4)MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
(5)MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
7、Canal 把自己伪装成 MySQL 的一个 slave 节点,从而监听 master 的 binary log 变化,再把得到的变化信息通知给 Canal 客户端,进而完成对其它数据库的同步
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战