四级缓存实现

时间:2024-03-21 16:30:12

CommandLineRunner接口的run方法

什么是多级缓存?

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

一级缓存:1.CDN:内容分发网络

二级缓存:2.NGINX+Lua脚本+OpenResty服务器 负载均衡反向代理【静态和转发】

三级缓存:JVM进程缓存【本地缓存Caffeine】

四级缓存:Redis缓存

五级缓存:Mysql集群+主从复制

Mysql

现在是Caffeine===》(程序)====》Redis===》(cannel 阿里现成的工具 监听mysql)===》Mysql

那这个程序怎么实现对redis的监听?

没有什么是加一层不能解决的【公共管理层】。

亮点+难点

1.自定义本地缓存初始化配置-咖啡因【CommandLineRunner】

2.自定义缓存控制器,用来制衡远程redis缓存和本地缓存localCacheCaffeine【这个就是所谓的公共管理层】

3.远程redis监听程序 健康度检查

4.断线重连

数据同步策略?

高可用+分布式数据最终一致性回答思路。

多种策略共存

1.设置有效期【缓存击穿】

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

对数据的即时性没有严格要求的应用场景,如一些只需要每天更新一次的报告数据。

优点:简单方便

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

场景:更新频率低,时效性要求低的场景

2.同步双写

在修改数据库的同时,直接修改缓存

优点:时效性强,缓存与数据库强一致

缺点:有代码侵入,耦合度高

场景:对一致性、时效性要求较高的缓存数据

3.异步通知

修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据。

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

缺点:时效性一半,可能存在中间不一致状态

场景:时效性要求一般,有多个服务需要同步

1.基于MQ消息

2.基于Canal的通知

3.自己写中间件

这个业务库后面再加一层DTS,然后通过监听实时分发给下游消费,不然直接在业务库监听,大批量物理操作或者敏感数据链路可以在新的DTS处理,这样相当于把业务彻底隔离开。

在数据库和其他系统组件之间增加一个中间层来处理数据同步。这个中间层可以实时监听数据库变更,并将这些变更分发给下游的消费者(如缓存服务)。这样做的好处包括:

  • 隔离业务逻辑和数据同步逻辑:保证业务数据库的操作不受缓存同步逻辑的影响,以此提高业务数据库的性能和稳定性。
  • 处理大批量操作:对于大批量的数据库操作,可以在DTS层进行处理,避免直接在业务数据库上产生大量负载。
  • 处理敏感数据:对于敏感数据,可以在DTS层进行必要的数据筛选和脱敏处理,然后再分发到下游。

将业务逻辑和数据同步逻辑隔离开,可以让系统的各个部分更加专注于它们自己的职责,提高系统的可维护性和扩展性。同时,这种架构设计还可以增强系统对高并发和高可用性的支持。

背景

假设你有一个在线电商平台,该平台的用户可以浏览商品、下订单、写评论等。这个平台的后端使用一个MySQL数据库来存储所有的业务数据,比如用户信息、商品信息、订单记录等。

场景

随着电商平台的快速增长,你发现以下问题:

  1. 高峰时段,大量用户下单导致数据库写入操作频繁,影响了数据库的性能。
  2. 你想实现一个实时推荐系统,该系统需要基于用户的最新交互数据来更新推荐内容。
  3. 为了提升性能,你决定使用缓存服务来减少数据库的读取压力。

问题

直接在业务数据库上实现这些功能会有以下问题:

  • 数据库可能会因为处理大量的同步、读写操作而成为性能瓶颈。
  • 如果直接在业务库上监听数据变更,任何监听过程中的延迟或错误都可能直接影响到主业务的稳定性和性能。

DTS层的引入

为了解决上述问题,你决定引入一个DTS层;这个DTS层可以理解为一个中间件或服务平台,它的角色如下:

  • 数据同步:DTS层监听业务数据库的变更(例如使用Binlog监听MySQL的变更)。当有新的订单产生时,DTS层捕获这个变更事件。
  • 数据分发:DTS层将捕获的事件发送给其他感兴趣的系统或服务,比如缓存更新服务、搜索索引服务、实时推荐系统等。
  • 数据处理:在分发之前,DTS层可以对数据进行必要的加工处理,例如数据清洗、转换格式、脱敏等。

例子

  1. 订单服务:当用户下单时,订单服务将订单信息写入数据库。
  2. DTS层捕获变更:DTS层监听到订单表有新的记录,它捕获了这个变更事件。
  3. 实时推荐系统更新:DTS层将订单信息发送给实时推荐系统,该系统根据新的订单更新用户的推荐列表。
  4. 缓存服务同步:DTS层同时通知缓存服务,让其更新相关的用户信息缓存,以确保其他用户看到的是最新的订单信息。

好处

  • 业务逻辑与数据同步解耦:业务数据库只需关注数据的存储和业务逻辑处理,而DTS层负责数据的同步和分发,避免了直接在业务库上额外增加处理负担。
  • 提高性能:DTS层可以批量处理和优化数据同步过程,减轻业务数据库的压力。
  • 增强安全性和隐私:DTS层可以对敏感数据进行脱敏处理,确保在传输过程中不泄露用户隐私。
  • 灵活性:可以根据需要为不同的下游系统定制数据分发和处理逻辑。

通过引入DTS层,电商平台的架构变得更加健壮和可扩展,能够更好地应对高并发场景,并为用户提供更加快速和个性化的服务。

设计多级缓存【如果redis数据量特别大 就不适合咖啡因了】

我们将进程内缓存与分布式缓存服务,结合有效分摊应用压力。在java应用层面,只有本地缓存Caffeine的缓存不存在时,再去redis分布式缓存获取,如果Redis也没有此数据再去数据库查询。数据查询成功后,对redis与Caffeine同时进行双写更新。这样java应用下一次再查询相同数据时,直接从本地Caffeine缓存获取,不再产生新的网络通信,应用查询性能得到显著提高。

1.先调用set