云原生|Java二级高速缓存架构设计

news2025/1/21 12:21:43

为什么使用缓存

缓存,主要有两个用途:提高服务性能和并发。

缓存是提高服务响应速度最快的方式之一。

我们设计缓存的目的是减少用户直接访问磁盘、访问网络带来的性能损耗,把磁盘、网络请求的内容存在在内存中,提升应用程序的访问速度和并发量。

高性能 

提高应用的查询性能是大部分使用缓存的目的,特别是一些数据变动极不频繁的业务场景,比如权限查询这种情况加入缓存可以大幅降低数据库的读压力,极大的提升查询性能。

我们将缓存中的key保存到缓存中,然后在需要查询的时候直接查询缓存,而不走数据库,这样响应速度非常快,并且对于数据库的压力很小,一般缓存的查询都在微秒级,分布式缓存Redis中查询数据也在1ms中可以查询出来,这样在系统架构不进行大的变化的情况下完成了500倍的性能提升。

所以对于一些需要复杂操作耗时查出来的结果,确定后面不怎么变化,但是有很多读请求,直接将查询出来的结果放在缓存中,后面直接读缓存就好。

高并发 

mysql 数据库对于高并发的读写场景支持比较弱,通常单机支撑到 2000QPS 就开始出现性能瓶颈了。

所以若是系统高峰期一秒钟有1万个请求,那么一个 mysql 单机绝对会死掉,这个时候就只能上缓存,把很多数据放入缓存,别放入 mysql,缓存功能简单,说白了就是 key-value 式操作,单机支撑的并发量一秒可达几万十几万,单机承载并发量是 mysql 单机的几十倍。

mysql 数据库对于高并发的读写场景支持比较弱,通常单机支撑到 2000QPS 就开始出现性能瓶颈了。

二级缓存模型

二级缓存读操作 

如不考虑并发等复杂场景、二级缓存读操作可以使用如下流程图表示:

通过上面我们了解到数据库、本地缓存、分布式缓存的访问速率:本地缓存>分布式缓存>数据库缓存。基于上面的结论,我们的二级缓存的第一级缓存采用本地缓存;第二级缓存采用分布式缓存。

二级缓存写操作

如不考虑并发等复杂场景、二级缓存写操作可以使用如下流程图表示:

二级缓存优点

本地缓存基于本地环境的内存,访问速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度。

使用本地缓存能够减少和Redis类的远程缓存间的数据交互,减少网络I/O开销,降低这一过程中在网络通信上的耗时。

二级缓存缺点

  • 功能增强的同时,也带来了数据一致性的复杂性,需要保证一级缓存、二级缓存、数据库3者之间数据的一致性;

  • 本地缓存失效、清理带来了复杂度,需要引入redis;

  • Spring cache目前只支持单缓存源,不支持多级缓存、需要对spring cache改造。

二级缓存实现

二级缓存选型

一级缓存:Caffeine是一个一个高性能的 Java 缓存库;使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率。优点数据就在应用内存所以速度快。缺点受应用内存的限制,所以容量有限;没有持久化,重启服务后缓存数据会丢失;在分布式环境下缓存数据数据无法同步;

二级缓存:redis是一高性能、高可用的key-value数据库,支持多种数据类型,支持集群,和应用服务器分开部署易于横向扩展。优点支持多种数据类型,扩容方便;持久化,重启应用服务器缓存数据不会丢失;他是一个集中式缓存,不存在在应用服务器之间同步数据的问题。缺点每次都需要访问redis存在IO浪费的情况。

二级缓存实现

从架构的可扩展性和可配置性考量,我们第一选择是对spring cache进行扩展,基于spring cache做二级缓存实现继承了spring cache的如下优点:

  • 通过少量的配置annotation注释即可使得既有代码支持缓存;

  • 支持开箱即用Out-Of-The-Box,既不需要安装和部署额外的第三方组件即可使用多级缓存;

  • 支持SpEL表达式、能使用对象的任何属性或者方法来定义缓存的key和condition;

  • 支持AspectJ、并通过器实现任何方法的缓存支持;

  • 支持自定义key和自定义缓存管理器、具有很大的灵活性和扩展性。

在@SpringbootApplication注释下面添加注解,@EnableConfigurationProperties(CacheConfigProperties .class)注入即可使用。

多级缓存spring cache适配

Spring Cache最核心的就是实现Cache和CacheManager接口。但是Spring Cache存在以下问题:

Spring Cache 仅支持单一的缓存来源,即:只能选择 Redis 实现或者 Caffeine 实现,并不能同时使用。

数据一致性,即:各层缓存之间的数据一致性问题,如应用层缓存和分布式缓存之间的数据一致性问题。

由此我们可以通过重新实现Cache和CacheManager接口,整合caffeine和redis,从而实现多级缓存。

核心实现之RedisCaffeineCache

本地缓存的过期策略、和主动清理都必须通过redis pub/sub机制实现。这样可以避免在分布式环境下,部分实例缓存不一致情况。

本地缓存监听redis消息。

RedisCaffeineCacheManager

RedisCaffeineCacheManager实现了CacheManager接口、并且进行了一定的扩展。

二级缓存使用

上文说道,为了让二级缓存使用简单、对spring cache进行扩展,可以像使用spring cache一样使用二级缓存。

具体步骤如下:

  • 需要引入依赖caffeine-redis-sping-boot-starter;

  • 开启spring cache @EnableCache;

  • 对目标方法使用spring cache注解。

总结

在元年商旅业务中存在各种各样的配置信息,包括: 基础数据(城市、火车站、机场等)、全局配置(数据字典、I18N信息)、租户配置(预定、对接、服务费、供应商等),这些数据部分属于静态数据、部分属于热点数据,根据业务要求每种数据的过期时间、缓存淘汰策略都略有不同。

二级缓存是支持商旅SAAS系统高并发的利器之一,有效的提升了商旅SAAS系统的性能和并发量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Doris】Doris数据库最新版安装方法,详细图文教程

环境安装 Doris 作为一款开源的 MPP 架构 OLAP 数据库,能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架构的并发优势,以及 Doris 的高可用特性,我们建议 Doris 的部署遵循以下需求: Linux 操作系统版本需求Linu…

研讨会回顾 | UI自动化测试现场演示

2022年12月6日,龙智与软件测试自动化“领导者”SmartBear联合举办了主题为“如何通过自动化测试实现降本、增效与提质”的在线研讨会。此次研讨会中,龙智技术工程师邱洁玉现场演示了使用UI自动化测试的过程,并简要介绍了API的自动化测试。 软…

时钟频率与时间单位的换算

1. 频率、时间 各自的单位的关系 频率: 1GHz 1000MHz、1MHz 1000KHz、1KHz 1000Hz 1GHz 103MHz 106KHz 109Hz 时间: 1s 1000ms、1ms 1000μs、1μs 1000ns [注]:s (秒)、ms (毫秒)、μs (微秒)、ns (纳秒)。 2. 时间 和 频率 的换…

jsp税务管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 税务管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发,数据库为Mysql,使用ja…

【SpringCloud10】OpenFeign服务接口调用

1.概述 1.1OpenFeign是什么 官网 Feign是一个声明式WebService客户端,使用Feign能让编写Web Service客户端更加简单。 它的使用方法是定义一个服务接口然后在上面添加注解,Feign也支持可拔插式的编码器和解码器,Spring Cloud对Feign进行了…

设计模式-JDBC中的桥接模式

一、首先看整个brige模式的结构图。如下:Abstraction — 抽象化角色:定义抽象的接口,包含一个对实现化角色的引用Refined Abstraciotn — 扩展抽象化角色:抽象化角色的子类,实现父类中的业务方法,并通过组合…

录屏专家怎么用?录屏软件使用教程(附下载)

想要更好地录制电脑屏幕可以使用电脑录屏专家,但有很多人在安装录屏专家之后,不知道如何使用。录屏专家怎么用?怎样使用录屏专家录制电脑屏幕?下面小编给您分享录屏软件使用的教程(附安装教程),…

RabbitMQ实战:性能和安全

本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。 前两篇介绍了RabbitMQ在可用性、监控方面的考虑,这是基础保障,因为在某些场景下是不容许丢失消息的,但它和性能往往是对立的,需要根据业务场景做取舍…

JSP SSM众包网站系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM众包网站系统 是一套完善的系统源码,对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助,系统具有完整的源代码和数据库,以及相应配套的设计文档,系统主要采用B/S模式开发。 研究的基本内容…

JUC并发编程学习笔记——CAS个人理解

1. CAS引出 1.1 悲观锁 顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只…

什么是 HTTP?

什么是 HTTP? 超文本传输协议 (HTTP) 是万维网的基础,用于通过超文本链接加载网页。HTTP 是应用程序层协议,旨在在联网设备之间传输信息,并在网络协议栈的其他层之上运行。HTTP 上的典型流涉及客户端计算机向服务器发出请求&…

2023CUPT第十四题 射流的折射 思路与解法

文章未完首先声明一点,这个题我还没想好最后的答案,欢迎交流(备注:博主今年不参加CUPT 博主去做电子设计大赛了!有电赛谁还玩CUPT啊)声明2:博主没有学过流体力学所以。。声明3:博主的…

[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数

转化为10进制 回忆上次内容 上这次总结了四种进制 函数名对应单词进制类型数字事例前缀bin()binary20b11000010boct()octal80o1410ohex()hexadecimal160x610x?decimal1097无 十进制数 可以转化 为 其他进制 的 字符串状态 那反过来 其他进制形态的字符串 可以转化回 10进制…

Qt 自带标题处理方法思路

目录 需求 相关方法也有两种 1.只需要继承QAbstractNativeEventFilter类,从写放nativeEventFilter,并调用安装函数installNativeEventFilter 2.第二种是Qt提供的继承QWidget 重写bool nativeEvent(const QByteArray &eventType, void *message, …

RocketMQ事务消息原理简析

零、业务场景 在项目中,经常遇到这样一个场景,需要保证数据持久化和消息发送要么同时成功,要么同时失败。比如当用户在交易系统下了一个订单,购物车需要消费订单消息清除加购数据、积分系统需要变更用户积分、短信平台需要给买家…

如何选择显示检波器

之所以介绍频谱仪的显示检波器,是因为在宽带信号功率测试、功率谱密度测试及相噪测试等应用中,对显示检波器的选择有一定的要求。如果选择的检波器不合适,那么将无法准确完成测试。本文的目的也是想让初学者对这一块内容有更多的认识&#xf…

新手运营适合哪个跨境电商平台

很多企业的网站被收录却没有排名,关键词优化不上去,网站也没有什么流量,不断更新文章,即使是原创,也排不上去,这究竟是由于哪些原因造成的呢?米贸搜作为专业的SEO平台,整理了以下几种…

茶叶为啥那么贵?

60000个嫩芽才制作一斤好茶 茶叶采摘成本太高 如何通过机器人采茶? 趣讲大白话:茶叶贵是有道理滴 *********** 浙江理工大学智能采茶机器人 能自主识别茶树芽叶 控制机械臂进行精准采摘 芽叶识别准确率能达到82%左右 平均采摘速度2.5秒/颗 采摘成功率达…

【NI Multisim 14.0原理图的设计——简单电路设计】

目录 🥝🥝序言 🍍1.使用菜单命令 🍍2.右键快捷命令 🍍3. 使用快捷键 🥝🥝一、放置导线 🍍1.自动连线 🍍2. 手动连线 🍍 3.设置导线的属性 &#x1f3…

单目ADAS系列教程-相机基础篇

文章目录前言相机相关的4大坐标系像素坐标系与图像坐标系的转换图像坐标系与相机坐标系的转换相机坐标系与世界坐标系的转换相机畸变标定方法小结前言 PS:本文仅讨论针孔模型相机,其余类型相机并不涉及! 相机基础包括相机内参,相…