引入实现过程WebSocket 后端1、实体类2、异常处理类3、游戏状态枚举类4、ws主类5、配置类及工具类引入引入与技术选型:在实时互动应用中,实现流畅的多人协同对战功能是一大挑战。WebSocket技术,以其全双工通信能力,提供了解决方案。不同于传统HTTP请求的短连接,WebSocket建立持久连接,极大减少了通信延迟,为实时数据传输提供了理想的环境,极大减少了传统HTTP轮询的延迟,为实时
我把这些事务问题归结成了三类:不必要、不生效、不回滚,接下用一些demo演示下各自的场景。不必要1. 无需事务的业务在没有事务操作的业务方法上使用 @Transactional 注解,比如:用在仅有查询或者一些 HTTP 请求的方法,虽然加上影响不大,但从编码规范的角度来看还是不够严谨,建议去掉。@Transactional public String testQuery() { stan
1 Cookie + Session由于 HTTP 协议是无状态的,完成操作关闭浏览器后,客户端和服务端的连接就断开了,所以我们必须要有一种机制来保证客户端和服务端之间会话的连续性,常见的,就是使用Cookie + Session (会话) 的方式。具体来说,当客户端请求服务端的时候,服务端会为此次请求开辟一块内存空间(Session 对象),服务端可以在此存储客户端在该会话期间的一些操作记录(比
在使用XXL—JOB的实现定时任务过程中,有时候可能由于部署环境的要求,就只能用Spring自带的实现方式。所以为了通用性和灵活性,突发奇想地看看能不能实现在不修改原本Spring定时任务代码的前提下,通过配置灵活控制定时任务具体的实现,同时任务的日志的管理也要同步进行切换。分析并列出需要解决的问题思路根据需求背景可以初步分析实现的大致方向和实现流程。实现的思路其实不复杂,重点在于如何具体去实现落
分布式日志框架服务的实现思路基本是一致的,如下:日志收集器:微服务中引入日志客户端,将记录的日志发送到日志服务端的收集器,然后以某种方式存储数据存储:一般使用ElasticSearch分布式存储,把收集器收集到的日志格式化,然后存储到分布式存储中web服务:利用ElasticSearch的统计搜索功能,实现日志查询和报表输出比较知名的分布式日志服务包括:ELK:elasticsearch、Logs
前言前后端未分离的验证码登录方案验证码生成流程如下登录验证流程如下前后端分离的验证码登录方案验证码生成流程如下登录验证流程如下动手撸轮子Kaptcha介绍新建项目并加入依赖验证码获取和查看前言为了防止世界被破坏,为了守护世界的和平。。。说错了,重来~为了防止验证系统被暴力pj,很多系统都增加了验证码效验,比较常见的就是图片二维码,业内比较安全的是短信验证码,当然还有一些拼图验证码,加入人工智能的二
一、引言流式编程的概念和作用Java 流(Stream)是一连串的元素序列,可以进行各种操作以实现数据的转换和处理。流式编程的概念基于函数式编程的思想,旨在简化代码,提高可读性和可维护性。Java Stream 的主要作用有以下几个方面:简化集合操作:使用传统的 for 循环或迭代器来处理集合数据可能会导致冗长而复杂的代码。而使用流式编程,能够用更直观、更简洁的方式对集合进行过滤、映射、排序、聚合
1.数据生成流程解析步骤如下:1.Producer创建时,会创建一个Sender线程并设置为守护线程2.生产消息时,内部其实是异步流程;生产的消息先经过拦截器->序列化器->分区器,然后将消息缓存在缓冲区(该缓冲区也是在Producer创建时创建)3.批次发送的条件为:缓冲区数据大小达到batch.size或者linger.ms达到上限,哪个先达到就算哪个4.批次发送后,发往指定分区,
1. 消息的发送与接收生产者主要的对象有: **KafkaProducer , ProducerRecord 。 其中 KafkaProducer 是用于发送消息的类, ProducerRecord 类用于封装Kafka的消息。 KafkaProducer 的创建需要指定的参数和含义:参数说明bootstrap.servers配置生产者如何与broker建立连接。该参数设置的是初始化参数。如果生产
Redis 的主从架构,其实就是利用多副本,将一份数据同时保存在多个实例上。单个实例出现故障后,一般都会过一段时间才能恢复,那么其他节点还是可以提供服务的。1. 为什么需要主从架构单点架构在Redis中可能会带来以下问题:单点故障:Redis单点故障会导致服务不可用,造成服务中断或者服务雪崩。高并发情况下,如果Redis单点出现故障,所有请求都会受到影响,无法得到有效响应。可用性问题:由于Redi
在SpringBoot中常用的简单类型参数进行配置属性注入的注解有以下两个:@Value 注解: 用于从配置文件中注入简单类型的值@ConfigurationProperties 注解:用于将配置文件中的属性映射到对象中 接下来我们就详细介绍一下这个两个注解@Value 注解用于从配置文件中注入简单类型的值 @Value注解进行属性注入步骤如下:在项目application.y
Apache Kafka是一个分布式流平台。一个分布式的流平台应该包含3点关键的能力:1.发布和订阅流数据流,类似于消息队列或者是企业消息传递系统2.以容错的持久化方式存储数据流3.处理数据流1. 为什么介绍Kafka1.高吞吐量:单机每秒处理十万级的消息量。即使存储了许多TB的消息,它也保持稳定的性能;2.高性能:单节点支持上千个客户端,并保证零停机和零数据丢失,利用Linux的页缓存;顺序读,
今天给大家带来几个我日常工作以及阅读源码必备的 IntelliJ IDEA 高级调试技巧,分分钟要起飞的节奏。1. 条件断点循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值。public static void main(String[] args) { for (int i = 0; i < 100; i++) {
在Java应用程序中,空指针异常是导致程序失败的最常见原因之一。为了更加优雅地处理空指针异常,Java8引入了Optional类库。Optional实际上是一个容器,可以保存类型T的值,或者仅仅保存null。通过使用Optional,我们能够避免显式进行空值检测,使代码更加清晰和健壮。1.Optional类是什么?Optional 类(java.util.Optional) 是一个容
1. 配置脱敏在Spring Boot开发中,使用Jasypt(Java Simplified Encryption)对配置进行脱敏相对简单的 jasypt存在两种加密方式:单密钥对称加密:一个密钥加盐,可以同时用作内容的加密和解密依据;非对称加密:使用公钥和私钥两个密钥,才可以对内容加密和解密;以上两种加密方式使用都比较简单,我们以springboot单密钥对称加密方式做示例1.1. 添加jas
1.可见性可见性(Visibility):是指一个线程对共享变量进行修改,另一个先立即得到修改后的最新值1.1 可见性案例演示一个线程根据boolean类型的标记flag, while循环,另一个线程改变这个flag变量的值,另 一个线程并不会停止循环public class VisibilityTest { // 多个线程都会访问的数据,我们称为线程的共享数据 // 定义一个静态
==: 操作符用于比较两个对象的地址是否相等equals(): 方法用于比较两个对象的内容是否相等为了更好地理解这个区别,让我们看一个例子:String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1.equals(str2)); // 输出 true System.ou
1.获取日期时间函数1.1 获取当前日期时间SELECT NOW(); # 2024-04-06 22:37:451.2 获取当前日期SELECT CURRENT_DATE(); # 2024-04-061.3 获取当前时间SELECT CURRENT_TIME(); # 22:39:042.日期格式化2.1 日期转指定格式字符串SELECT DATE_FORMAT('2022-01-08 22
Monitor实现的锁属于重量级锁,你了解过锁升级吗?前面我们说了 synchronized 底层由monitor实现的,它那 synchronized 到底锁的是什么呢?随着 JDK 版本的升级,synchronized 又做出了哪些改变呢?“synchronized 性能很差”的谣言真的存在吗?重量级锁当另外一个线程执行到同步块的时候,由于它没有对应 monitor 的所有权,就会
Sharding基于inline模式实现水平分表1. 数据准备1.1. 水平分别数据准备order_db_1 ├── t_order_1 └── t_order_21.2. SQL准备#创建数据库 CREATE DATABASE `order_db_1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; #建表 USE order_db_1;
原理原理图如下:主要分析如下:何时加锁?线程去获取锁,获取成功: 执行lua脚本,保存数据到redis数据库。线程去获取锁,获取失败: 一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis什么是WatchDog自动延期机制?在一个分布式环境下,假如一个线程获得锁后,突然服务器宕机了,那么这个时候在一定时间后这个锁会自动释放,你也可以设置锁的有效时间(不设置默认30秒)
1.ShardingSphere生态简介Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,核心由: JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成;功能特性:它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
1、快速开始1.1、引入依赖<dependency> <groupId>io.github.burukeyou</groupId> <artifactId>jdframe</artifactId> <version>0.0.2</version> </dependency>1.2
在 Java 中实现 PDF 文件的编辑,包括给定变量赋值,通常涉及到使用第三方库来处理 PDF 文档。Apache PDFBox 和 iText 是两个非常流行且功能强大的库,它们都可以用来创建和修改 PDF 文件。这里,我将以 Apache PDFBox 为例,演示如何在 PDF 文档中赋变量值。Apache PDFBox 示例首先,确保你的项目中加入了 Apache PDFBox 的依赖。如
在现代Web应用中,生成PDF文件是一个常见的需求。为了满足这一需求,我们可以利用Spring Boot集成Thymeleaf和Flying Saucer PDF来生成具有丰富内容的PDF文件。Thymeleaf作为模板引擎,提供了简单而强大的模板语法,而Flying Saucer PDF则是一个用于将HTML转换为PDF的工具1. 选择Thymeleaf和Flying Saucer的原因Thym
1.RESP协议简介Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub):客户端(client)向服务端(server)发送一条命令服务端解析并执行命令,返回响应结果给客户端客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。在Redis中采用的是RESP(Redis Serialization Protocol)协议:Redis 1.
}2.3. 使用自定义注解进行标记在你的实体类中使用@SensitiveField注解标记需要脱敏的字段:@TableName(value ="tb_tutorial") @Data public class Tutorial implements Serializable { private Long id; private String title;
在Java的软件设计开发中,通信架构不可避免,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺陷,其中最令人恼火的是基于性能低下的同步阻塞式的I/O通信(BIO),随着互联网开发下通信性能的高要求,Java在2002年开始支持了非阻塞式的I/O通信技术NIO。1.
背景介绍我们使用了 mybatis-plus 框架,并采用其中的 saveBatch 方法进行批量数据插入。然而,通过深入研究源码,我发现这个方法并没有如我期望的那样高效这是因为最终在执行的时候还是通过for循环一条条执行insert,然后再一批的进行flush ,默认批的消息为1000为了找到更优秀的解决方案,我展开了一场性能优化的探索之旅。好了我们现在开始探索实验准备创建一张表tb_stude
1. 优雅的key结构Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定:遵循基本格式:[业务名称]:[数据名]:[数据/数据id]长度不超过44字节不包含特殊字符例如:我们的登录业务,保存用户信息,其key可以设计成如下格式:优点:可读性强避免key冲突方便管理更节省内存: key是string类型,底层编码包含int、embstr和raw三种。embstr在小于44字节使用,采
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号