自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(158)
  • 收藏
  • 关注

原创 Caffeine — 本地缓存

本地缓存(Local Cache)是指将常用的、固定的数据存储在应用程序的内存中(通常是 JVM 堆内存),以便快速访问。它是构建高性能系统的重要手段之一。具备两大特点的数据:数据量小长时间不会发生变化。像这样的数据,除了建立Redis缓存以外,还非常适合做本地缓存(Local Cache)。这样就可以形成多级缓存机制:数据查询时优先查询本地缓存本地缓存不存在,再查询Redis缓存Redis不存在,再去查询数据库。

2024-11-27 15:24:47 527

原创 问答功能设计思路

问答功能是在线学习平台中非常重要的一部分,它不仅能够促进用户之间的互动,还能帮助用户解决学习中遇到的问题,提升学习效果和平台的黏性。尤其是在课程学习场景下,用户可以基于具体的课程、章节或知识点提出问题,并得到回答。整个功能需求旨在为用户提供一个高效、便捷、结构清晰的互动环境。:用户可以提问、回答问题,并与其他用户进行交流。:用户的回答可以帮助其他用户解决类似的问题,形成一个知识库。

2024-11-26 15:45:00 1047

原创 视频播放进度记录方案改进

为了更精确的记录用户上一次播放的进度,我采用的方案是:前端每隔10秒就发起一次请求,将播放记录写入数据库。这涉及到大量的数据库写操作,在并发较高的情况下,会给数据库带来非常大的压力。该怎么解决呢?

2024-11-26 08:30:00 1030

原创 视频播放进度记录实现思路

视频播放的进度记录,需要实现视频续播功能。首先,要做到切换设备后还能续播,用户的播放进度必须保存在服务端,而不是客户端。其次,用户突然断开或者切换设备,续播的时间误差不能超过20秒,那播放进度的记录频率就需要比较高。前端每隔10秒就发起一次心跳请求,提交最新的播放进度,记录到服务端。这样用户下一次续播时直接读取服务端的播放进度,就可以将时间误差控制在10秒左右。网站课程以录播视频为主,为提升学习体验,需要实现视频续播功能。用户断开连接或切换设备后,仍然可以从上一次播放位置继续学习。

2024-11-25 14:00:00 931

原创 DelayQueue — 延迟任务

DelayQueue是 Java 并发包()中提供的一种,用来处理延迟任务。它的核心功能是存储实现了Delayed接口的对象,并根据延迟时间进行排序,只有延迟到期的任务才能被取出和处理。

2024-11-25 08:30:00 417

原创 依赖注入的最佳实现

Spring 提供多种方式实现依赖注入(DI),用于管理和使用各种Bean。依赖注入的目的是将对象的依赖关系交由 Spring 容器管理,提升代码的可维护性和解耦性。

2024-11-19 16:36:15 344

原创 nacos占用内存过高问题

在微服务项目的学习和开发过程中,服务注册中心 Nacos 是一个必不可少的组件。Nacos 提供了服务注册、配置管理等核心功能,使得分布式服务可以轻松实现互相发现、负载均衡和动态配置。然而,许多微服务项目中包含多个模块,开发人员经常需要同时启动多个模块,以确保各模块之间的通信和业务逻辑的正常运行。但是,由于 Nacos 默认以集群模式启动,即使是在本地学习环境中也会消耗较高的内存资源。默认配置下,Nacos 启动时通常会占用 2GB 左右的内存。

2024-11-10 08:30:00 965 1

原创 Seata — 分布式事务

分布式事务是指在分布式系统中,事务涉及到多个数据库和服务,需要跨多个系统节点协调完成事务的提交和回滚,保证系统的一致性。由于涉及多个节点,分布式事务比单一数据库中的事务实现更为复杂。归其原因就是参与事务的多个子业务在不同的微服务,跨越了不同的数据库。虽然每个单独的业务都能在本地遵循ACID,但是它们互相之间没有感知,不知道有人失败了,无法保证最终结果的统一,也就无法遵循ACID的事务特性了。

2024-11-09 14:45:00 969

原创 SpringAMQP — RabbitMQ操作工具

Spring AMQP(Spring for Advanced Message Queuing Protocol) 是 Spring 框架的一个子项目,用于简化与消息代理(如 RabbitMQ)的集成。Spring AMQP 提供了基于 AMQP 协议的抽象层,使得 Java 程序员能够更轻松地使用消息队列完成异步通信、消息分发和数据流处理。Spring AMQP 的核心模块是 spring-rabbit,它封装了与 RabbitMQ 的交互。

2024-11-09 08:30:00 1224

原创 RabbitMQ — 异步调用

RabbitMQ 是一个开源的消息代理中间件,它使用高级消息队列协议(AMQP, Advanced Message Queuing Protocol)来实现不同系统之间的消息传递。它以 Erlang 语言编写,具有高可靠性、灵活性和易于扩展的特点,被广泛应用于异步通信、数据流处理等场景。

2024-11-08 11:04:47 1146

原创 异步通讯介绍

微服务一旦拆分,必然涉及到服务之间的相互调用,基于OpenFeign的调用,这种调用中,调用者发起请求后需要服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们称这种调用方式为,也可以叫。但在很多场景下,我们可能需要采用的方式。同步通讯:就如同打视频电话,双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。异步通讯:就如同发微信聊天,双方的交互不是实时的,你不需要立刻给对方回应。因此你可以多线操作,同时跟多人聊天。

2024-11-08 10:12:15 369

原创 Sentinel — 微服务保护

微服务架构将大型应用程序拆分为多个小而独立的服务,每个服务可以独立部署和扩展。然而,微服务系统需要面对的挑战也随之增加,例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此,微服务保护措施是确保系统在高并发、资源消耗和恶意攻击等压力下依然稳定运行的重要手段。保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。

2024-11-07 16:20:13 1087

原创 SpringCloudGateway — 网关登录校验

单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,不再共享数据。也就意味着每个微服务都需要做登录校验,这显然不可取。既然网关是所有微服务的入口,一切请求都需要先经过网关。我们完全可以把登录校验的工作放到网关去做。

2024-11-06 16:58:36 926

原创 nacos — 动态路由

Nacos 是一个阿里巴巴开源的服务注册中心,广泛用于微服务架构中。它除了支持服务注册和配置管理外,还可以配合网关实现。动态路由能够根据配置的实时更新动态调整路由规则,避免应用重启,实现路由的灵活管理。网关的路由配置全部是在项目启动时由在项目启动的时候加载,并且一经加载就会缓存到内存中的路由表内(一个Map),不会改变。也不会监听路由变更,所以,我们无法利用配置热更新来实现路由更新。因此,我们必须监听Nacos的配置变更,然后手动把最新的路由更新到路由表中。

2024-11-06 16:02:12 1172

原创 SpringCloudGateway — 网关路由

Spring Cloud Gateway 是 Spring 提供的一个高效、灵活的 API 网关解决方案,基于 Spring 5、Spring Boot 2 和 Project Reactor,具有高并发和低延迟的特点。它用于在微服务架构中对外提供统一的入口,处理请求的路由、过滤、负载均衡等功能。

2024-11-05 16:30:28 1268

原创 OpenFeign — 远程调用

OpenFeign 是一个简化微服务调用的强大工具,通过声明式接口定义、丰富的配置选项、和 Spring Cloud 的无缝集成,可以极大地简化服务之间的通信。在使用过程中,可以结合 Ribbon、Hystrix 等组件,实现负载均衡和熔断降级等高级特性。

2024-11-05 11:09:12 673

原创 nacos — 配置管理

Nacos 不仅是一个服务注册与发现平台,还提供了功能强大的服务。Nacos 的配置管理能够帮助开发者集中管理配置,并支持动态更新,以简化微服务的配置变更过程,减少应用重启次数,确保应用实时响应配置变更。

2024-11-04 10:51:29 1081

原创 nacos — 服务注册和发现

Nacos(Naming and Configuration Service)是阿里巴巴开源的一个集于一体的平台,广泛应用于微服务架构中。Nacos 支持主流的服务发现和配置管理模式,适合 Spring Cloud 和 Dubbo 等微服务框架。:Nacos 允许微服务动态注册到 Nacos Server,当服务实例上线或下线时,Nacos 会自动更新服务列表。这样,其他服务可以及时获取到最新的可用服务实例,提高了系统的灵活性和可用性。

2024-11-02 16:41:01 1047

原创 Docker — 跨平台和环境部署

Docker 是一个开源的容器化平台,通过将应用程序和其依赖打包在一个轻量级、独立的容器中,能够跨平台和环境部署。

2024-11-02 15:07:10 1739 2

原创 Tomcat 和 Docker部署Java项目的区别

如果项目是传统的 Java Web 应用,且规模较小、无需频繁扩展,那么直接使用 Tomcat 可能是更简单的选择。如果项目是基于微服务架构,或者需要跨环境运行、频繁扩展,那么 Docker 是更适合的方案,可以通过容器化来实现应用的高可用、弹性扩展和一致性。可以在 Docker 容器中运行 Tomcat,将两者结合起来。这种方式可以利用 Docker 的环境隔离和可移植性,同时使用 Tomcat 处理 Java Web 应用的 HTTP 请求,适合需要运行在不同环境中的 Java Web 项目。

2024-10-31 15:25:32 1534

原创 MyBatis-Plus快速入门

MyBatis-Plus 是在 MyBatis 框架之上的增强工具,它提供了 CRUD(Create, Read, Update, Delete)操作的自动化实现,减少了开发人员编写 SQL 代码的工作量。MyBatis-Plus 的目标是提高开发效率,减少重复代码,并保持和 MyBatis 的兼容性。

2024-10-31 14:17:43 1055

原创 Apache POI—读写Office格式文件

Apache POI 是处理 Excel 文件的强大工具,通过 POI 可以实现 Excel 的创建、读取、编辑、写入等操作。小数据量使用 XSSFWorkbook,大数据量使用 SXSSFWorkbook。掌握基本的单元格操作、样式设置、数据格式和公式应用,可以满足绝大多数的 Excel 操作需求。

2024-10-29 17:07:35 1069

原创 用户统计开发思路

对于图表统计的场景,前端开发,可以基于Apache ECharts,展示各种各样的图表。不管是哪种形式的图形,最本质的东西实际上是数据,它其实是对数据的一种可视化展示。所以后端只需要提供符合格式要求的动态数据,然后响应给前端来展示图表。

2024-10-29 14:45:28 1179

原创 WebSocket—双向实时通信

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。双向通信:WebSocket 支持双向通信,客户端和服务器可以相互发送消息,而不需要不断地建立新的连接。高效性:WebSocket 数据帧头信息小,节省带宽;并且连接建立后可长期保持,适合实时应用场景。使用场景:WebSocket 适用于各种实时数据场景,如聊天应用、股票行情、物联网、实时位置服务等。

2024-10-28 16:46:20 1698

原创 Spring Task—定时任务

Spring Task 是 Spring 提供的一种轻量级定时任务调度功能,内置在 Spring 框架中。与 Quartz 等重量级调度框架相比,Spring Task 使用简便,无需额外依赖,适合在简单的调度任务场景中使用。通过注解配置方式,开发者可以快速实现周期性任务执行,非常适合 Spring Boot 项目中的定时任务需求。

2024-10-28 15:44:41 1056

原创 MySQL 字段类型介绍

在 MySQL 中,设计数据库表时,需要根据数据的实际需求选择合适的数据类型,以确保数据存储的准确性和节省存储空间。MySQL 提供了丰富的字段类型,主要分为以下几类:数值类型、字符串类型、日期时间类型、和JSON类型等。数值类型用于存储整数和小数。可以根据业务需求选择整数型、浮点型或定点型数值类型。

2024-10-27 15:37:21 1774

原创 主键冲突问题

在事务性的操作中,删除的记录不会立即被数据库确认删除,而是要等整个事务提交后才生效。所以如果要删除后重新插入数据,在插入之前要清空id,强制 MyBatis-Plus 生成新的主键值,避免主键冲突。

2024-10-27 14:00:00 473

原创 Spring Cache-基于注解的缓存

Spring Cache 是 Spring 提供的缓存抽象框架,能够将数据缓存到内存或外部缓存中,减少数据库或远程服务的访问频率,从而显著提升应用性能。Spring Cache 通过注解的方式实现缓存逻辑,使用方便,支持多种缓存实现,例如 ConcurrentMap、EhCache、Redis 等。

2024-10-27 11:36:38 915

原创 微信登录功能开发

用户进入到小程序的时候,首先需要微信授权登录。获取当前微信用户的相关信息,比如昵称、头像等,这样才能够进入到小程序进行其他操作。是基于微信登录来实现小程序的登录功能,没有采用传统账户密码登录的方式。若第一次使用小程序,就是一个新用户,需要把这个新的用户保存到数据库当中完成自动注册。

2024-10-27 08:30:00 1405

原创 微信小程序开发

微信小程序是一种创新的开放生态系统,开发者可以利用小程序快速构建、发布功能丰富的应用,而无需用户单独下载。小程序能够在微信内便捷获取和传播,为用户提供轻量但优质的使用体验,在功能和体验上与原生应用非常接近。小程序主要运行微信内部,可通过上述网站来整体了解微信小程序的开发。

2024-10-26 13:21:34 816

原创 HttpClient—请求第三方的服务

当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时,其实,应用程序本身并未实现这些功能,都是在应用程序里访问提供这些功能的服务,访问这些服务需要发送HTTP请求,并且接收响应数据,可通过HttpClient来实现。

2024-10-26 12:25:21 1293

原创 Redis项目中应用

在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

2024-10-24 15:25:35 1422

原创 Redis介绍

Redis 作为一个高性能的内存数据库,在现代互联网应用中扮演着重要的角色。通过合理地设计和使用 Redis,可以显著提高系统的性能和响应速度。

2024-10-24 10:30:23 886

原创 @RequestParam 导致的报错

对于简单的参数类型(如 String、int),如果方法参数的名称和 URL 中的查询参数名称匹配,Spring 可以自动完成映射,所以在这些情况下,@RequestParam 可以省略。但对于集合类型或复杂对象,@RequestParam 不能省略,必须显式告诉 Spring 该如何处理这些请求参数。

2024-10-23 15:18:45 508

原创 NullPointerException—配置属性为null

Spring 的依赖注入是在 Bean 实例化后进行的,因此如果在 Bean 实例化时就使用未注入的依赖项(比如@Autowired的属性),可能会导致。为了解决这个问题,可以延迟对依赖项的使用(即在方法中使用),或者手动管理Bean对象。

2024-10-23 08:30:00 809

原创 字节流和字符流

IO流是用于处理数据传输的工具,它通过输入流(Input Stream)来读取数据,通过输出流(Output Stream)来写入数据。数据的传输可以来自文件、内存、网络等。我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出output,即流向内存是输入流,流出内存的输出流。Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。

2024-10-22 15:49:04 1157

原创 文件上传-阿里云OSS

文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。云服务指的就是通过互联网对外提供的各种各样的服务,比如像:语音服务、短信服务、邮件服务、视频直播服务、文字识别服务、对象存储服务等等。当我们在项目开发时需要用到某个或某些服务,就不需要自己来开发了,可以直接使用阿里云提供好的这些现成服务就可以了。

2024-10-22 12:42:16 1429

原创 公共字段自动填充-MyBatis-Plus

在 MyBatis-Plus 中,可以通过实现 MyBatis-Plus 提供的 MetaObjectHandler 接口来实现公共字段的自动填充,比如在插入或更新数据时,自动填充创建时间、更新时间等字段。

2024-10-20 16:09:23 742

原创 公共字段自动填充-AOP

在所有的新增和更新的业务操作中,都需要对上述字段进行赋值操作,编码相对冗余、繁琐,那能不能对于这些公共字段在某个地方统一处理,来简化开发呢?答案是可以的,可以使用AOP切面编程,实现功能增强,来完成公共字段自动填充功能。还可以使用拦截器统一对公共字段赋值,下面使用AOP技术解决上述问题。

2024-10-20 14:29:10 923

原创 SQL异常处理

在大型项目中,异常处理是非常重要的一个环节。处理异常可以提升用户体验,让用户看到更有意义的提示,而不是直接让程序崩溃或者返回不友好的错误信息。

2024-10-19 22:30:00 622

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除