当前位置: 首页 > news >正文

四级缓存实现

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

相关文章:

四级缓存实现

CommandLineRunner接口的run方法 什么是多级缓存? 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Server端的压力,提升服务性能。 一级缓存:1.CDN:内容分发网络 二级缓存:2.NGINX+Lua脚本+OpenResty服务器 负载均衡反向代理【静态和转发】 三级缓存:J…...

程序员如何规划职业赛道?

在快速发展的信息技术时代,程序员作为数字世界的构建者,面临着前所未有的职业选择和发展机会。选择合适的职业赛道,不仅关乎个人职业发展的高度和速度,更影响着个人职业生涯的满意度和幸福感。本文将从自我评估与兴趣探索、市场需…...

蓝桥杯day3刷题日记--P9240 冶炼金属

P9240 [蓝桥杯 2023 省 B] 冶炼金属 经典二分&#xff0c;先在第一组中找到最小值&#xff0c;在利用最小值限制范围寻找最大值 #include <iostream> #include <algorithm> using namespace std; int n,kk; int m[10001],num[10001]; int maxs,mins;bool check1…...

Mybatis-xml映射文件与动态SQL

xml映射文件 动态SQL <where><if test"name!null">name like concat(%,#{name},%)</if><if test"username!null">and username#{username}</if></where> <!-- collection&#xff1a;遍历的集合--> <!-- …...

MySQL_数据库图形化界面软件_00000_00001

目录 NavicatSQLyogDBeaverMySQL Workbench可能出现的问题 Navicat 官网地址&#xff1a; 英文&#xff1a;https://www.navicat.com 中文&#xff1a;https://www.navicat.com.cn SQLyog 官网地址&#xff1a; 英文&#xff1a;https://webyog.com DBeaver 官网地址&…...

流媒体学习之路(WebRTC)——FEC逻辑分析(6)

流媒体学习之路(WebRTC)——FEC逻辑分析&#xff08;6&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全…...

command failed: npm install --loglevel error --legacy-peer-deps

在使用vue create xxx创建vue3项目的时候报错。 解决方法&#xff0c;之前使用的https://registry.npm.taobao.org 证书过期更换镜像地址即可 操作如下&#xff1a; 1.cd &#xff5e;2.执行rm .npmrc3. sudo npm install -g cnpm --registryhttp://registry.npmmirror.com…...

KubeSphere集群安装-nfs分布式文件共享-对接Harbor-对接阿里云镜像仓库-遇到踩坑记录

KubeSphere安装和使用集群版 官网:https://www.kubesphere.io/zh/ 使用 KubeKey 内置 HAproxy 创建高可用集群:https://www.kubesphere.io/zh/docs/v3.3/installing-on-linux/high-availability-configurations/internal-ha-configuration/ 特别注意 安装前注意必须把当前使…...

Epuck2机器人固件更新及IP查询

文章目录 前言一、下载固件更新软件包&#xff1a;二、查询机器人在局域网下的IP 前言 前面进行了多机器人编队仿真包括集中式和分布式&#xff0c;最近打算在实物机器人上跑一跑之前的编队算法。但由于Epuck2机器人长时间没使用&#xff0c;故对其进行固件的更新&#xff0c;…...

C goto 语句

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 注意&#xff1a;在任何编程语言中&#xff0c;都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪&#xff0c;使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语…...

【排序算法】-- 深入理解桶排序算法

概述 在计算机科学中&#xff0c;排序算法是一种对数据进行有序排列的重要技术。桶排序&#xff08;Bucket Sort&#xff09;是一种常见的排序算法&#xff0c;它通过将数据分到有限数量的桶中&#xff0c;并对每个桶中的数据分别排序&#xff0c;最后按照顺序将所有桶中的数据…...

【Linux】Ubuntu使用Netplan配置静态/动态IP

1、说明 Ubuntu 18.04开始,Ubuntu和Debian移除了以前的ifup/ifdown命令和/etc/network/interfaces配置文件,转而使用ip link set或者/etc/netplan/01-netcfg.yaml模板和sudo netplan apply命令实现网络管理。 Netplan 是抽象网络配置描述器,用于配置Linux网络。 通过netpla…...

chatGLM3+chatchat实现本地知识库

背景 由于客服存在大量的问题为FAQ问题&#xff0c;需要精准回复客户&#xff0c;所以针对此类精准问题&#xff0c;通过自建同量数量库进行回复。 落地方案 通过chatGLM3-6Blangchain-chatchatbge-large-zh实现本地知识库库。 注意&#xff1a;相关介绍和说明请看官网~ 配置要…...

webpack5零基础入门-11处理html资源

1.目的 主要是为了自动引入打包后的js与css资源&#xff0c;避免手动引入 2.安装相关包 npm install --save-dev html-webpack-plugin 3.引入插件 const HtmlWebpackPlugin require(html-webpack-plugin); 4.添加插件&#xff08;通过new方法调用&#xff09; /**插件 *…...

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…...

C语言经典面试题目(十八)

1、如何在C语言中实现堆排序算法&#xff1f; 堆排序是一种利用堆数据结构进行排序的算法。它的基本思想是首先将待排序的数组构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后逐步将堆顶元素与堆中最后一个元素交换&#xff0c;并重新调整堆&#xff0c;使…...

[数据集][目标检测]零售柜零食检测数据集VOC+YOLO格式5422张113类

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5422 标注数量(xml文件个数)&#xff1a;5422 标注数量(txt文件个数)&#xff1a;5422 标注…...

Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask vs. Django&#xff1a;选择适合你的Web开发框架 在选择一个适合你项目的Web开发框架…...

你能解释一下Spring AOP(面向切面编程)的概念和用法吗?在Spring中,如何使用事务管理?

你能解释一下Spring AOP&#xff08;面向切面编程&#xff09;的概念和用法吗&#xff1f; Spring AOP&#xff08;面向切面编程&#xff09;是Spring框架中一个非常重要的功能模块&#xff0c;它允许开发者通过预编译方式和运行期动态代理来实现程序功能的统一维护。AOP并不是…...

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现GWO-CEEMDAN基于灰狼算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CEEMDAN方法的分解效果取决于白噪声幅值权重(Nstd)和噪声添…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...