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

相关推荐
IvorySQL1 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl1 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦3 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
C++ 老炮儿的技术栈5 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客5 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
zt1985q6 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL7 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃8 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo80978 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
Exclusive_Cat8 小时前
MySQL回表机制解析与优化策略
数据库·sql