Redis的多级缓存

在分布式式架构中,我们尽量要保证其高可用性,比如一个查询商品的服务,从nginx->tomcat->redis->mysql,其中往往性能瓶颈就是tomcat,其次就是mysql。

为了尽可能的减少tomcat或者mysql的压力,我们引入了多级缓存,其核心思想就是在每一级都添加缓存,尽可能减少调用的链路,比如nignx中添加缓存,nginx直接访问redis(这样能跳过tomcat了),nginx访问tomcat的进程缓存(一般就是java的本地缓存了),最后才是访问数据库。

首先nginx本身是不带缓存的,也没有判断缓存是否存在的手段,这就需要引入OpenResty,可以理解为nginx+lua脚本。有了OpenResty就可以使用nginx的本地缓存功能,如果是一台nginx服务器,性能肯定受影响的,所有可以组成集群,前面再加一台nginx服务器,作为反向代理用。这样就会有新的问题,每次访问不同nginx服务器,那是不是每台都要存一遍数据,所以这里需要配置hash $requestUri的轮询方式,保证每次商品查询都访问到一台服务器上去(这里访问路径就包含了商品id的前提);

如果nginx本地缓存没有命中,就去查询Redis,Redis没有命中再去发http请求到tomcat(这里也需要配置hash $requestUri的轮询方式),tomcat又是查本地缓存(比如caffeine),没有命中再查数据库,查到数据写回进程缓存(tomcat的本地缓存就是caffeine),然后回到OpenResty再回填nginx的本地缓存。

但是如果数据修改了怎么办?方案是用Cannal技术,大概就是监听mysql的master的binlog的写事件,然后回填数据到Redis和进程缓存。(这里没有同步nginx的本地缓存)。

上面就是多级缓存查询的流程和数据同步的方案。

思考:

但是好像少了回填nginx的本地缓存的机制,看弹幕说通过设置过期时间自己过期的,没数据触发后面数据的时候回填,但是这样修改数据肯定会有延时。那么是否可以设置很短的时间,这样即使延时了,时间也很短,但是个人感觉用到nginx缓存的应该是热点数据了这样触发redis查是否合适;还有一种是OpenResty里写一个接口(路由规则),里面写更新nginx本地缓存的逻辑,修改的同步方案中增加一步调这个接口,感觉这个靠谱。如果有知道的,有好的解决方案麻烦告知。

创作来源b站视频,链接:https://www.bilibili.com/video/BV1cr4y1671t?spm_id_from=333.788.videopod.episodes&vd_source=5cdd04cd106e2c17afbf3ebd1143d654&p=132

相关推荐
茶杯梦轩32 分钟前
从零起步学习Redis || 第七章:Redis持久化方案的实现及底层原理解析(RDB快照与AOF日志)
redis·后端
IT邦德43 分钟前
RPM包快速安装Oracle26ai
数据库·oracle
Dovis(誓平步青云)43 分钟前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
mr_LuoWei20091 小时前
python工具:python代码知识库笔记
数据库·python
这周也會开心1 小时前
Redis数据类型的底层实现和数据持久化
数据库·redis·缓存
ん贤1 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
数据知道1 小时前
PostgreSQL 核心原理:系统内部的对象寻址机制(OID 对象标识符)
数据库·postgresql
倔强的石头_2 小时前
关系数据库替换用金仓:数据迁移过程中的完整性与一致性风险
数据库
Elastic 中国社区官方博客2 小时前
使用 Groq 与 Elasticsearch 进行智能查询
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
My LQS2 小时前
使用 Redis Stack 向量索引构建大模型问答缓存系统
redis·缓存·ai