多级缓存(亿级并发解决方案)

多级缓存(亿级流量(并发)的缓存方案)

传统缓存的问题

传统缓存是请求到达tomcat后,先查询redis,如果未命中则查询数据库,问题如下:

(1)请求要经过tomcat处理,tomcat成为整个系统的瓶颈。

(2)redis缓存失效时,会对数据库产生冲击。(缓存雪崩等各个问题)

tomcat本身的缓存(并发)能力是不如redis的。

多级缓存

(1)多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻tomcat压力,提升服务性能。

静态资源请求存入到浏览器客户端缓存,非静态数据进入到nginx服务器(此时的nginx为nginx的本地缓存,可编程将查询数据去访问redis中,不去请求tomcat),可将数据存入到业务nginx中。redis缓存未命中时,到达tomcat中可读取进程缓存来获得数据。tomcat进程缓存未命中,就到达

数据库。

(2)redis缓存失效时,(发生缓存雪崩等)可以使用tomcat进程(也称jvm进程缓存)缓存做缓冲,从而避免了全部访问数据库。

(3)业务nginx内部需要编写对redis的访问和对tomcat进程缓存的访问。

(4)业务nginx通常作为集群的形式

jvm进程缓存

使用lua语言编写业务nginx的逻辑

缓存同步策略

缓存数据同步的常见方式

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

缺点:时效性差,缓存过期前可能不一致

优点:简单、方便 ,适用于更新频率低,时效性要求低的业务

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

复制代码
	优势:时效性强,强一致性
	缺点:业务代码中有侵入代码(更新缓存操作),耦合度高;适用于对一致性和时效性较高的缓存数据。

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

优点:低耦合,可以同时通知多个缓存服务

缺点:时效性一般(其实也就够了,mq收到消息之间只是ms级别);适用于有多个服务需要同步。

<1> 基于mq的异步通知(仍需要在代码中进行操作mq)

<2> 基于Canal的异步通知(通过监听数据库的变化)

canal监听原理

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

项目(在默认tomcat容器中)编写监听Canal客户端

引入依赖

编写配置:

复制代码
canal:
	destination:test   # canal实例名称,要跟canal-server运行时设置的destination一致。
	server:安装ip:端口号    # canal地址

编写监听器

实现EntryiHandler接口,重写方法(监听到数据库的新增、修改、删除会执行对应的方法)

编写指定的实体类Item(表和实体类之间的映射关系)

@Id : 声明表的逐渐

@Transient: 表示不是当前表的字段

@Column:当数据库和实体类字段名称不一致时编写

相关推荐
温暖小土39 分钟前
在 CentOS 上安装 Redis Stack
linux·redis·centos
海的透彻1 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat1 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one2 小时前
算法--构造
java·数据结构·算法
SL_staff2 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff3 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko74 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.4 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff4 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈