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

相关推荐
starrocks_stella1 小时前
EMR Serverless StarRocks Object Table:用 SQL 连接 OSS 文件与多模态 AI
数据库
这个DBA有点耶1 小时前
以为自增ID只是有空洞?聊聊双主架构下无声的“数据覆盖”
数据库·mysql·dba
钱栈up2 小时前
内网全断,怎么核实高炉和烧结系统的数据库对接信息
数据库
weavecodes2 小时前
双层缓存与权限实时生效:织码在线教育系统的 Caffeine + Redis 设计
数据库
bksczm2 小时前
InnoDB 页结构详解:页类型、页头页尾、数据行与页目录
数据库·mysql
bksczm3 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
字节跳动开源4 小时前
OpenViking连接业务系统,LLM Wiki一键编译
数据库·开源
用户094248568034 小时前
第22章:Redis 持久化 RDB 与 AOF:数据不丢的底线
redis·架构·源码
没有气的汽水4 小时前
升级完客户端,redis 又开始大量返回 MOVED:一个埋了七个月的本地配置
redis
csdn_aspnet4 小时前
如何在本地 Docker 容器中运行 Redis,并使用 Redis Insight 和 Redis CLI 进行管理
redis·docker·容器