JUnit5单元测试框架提供的注解
目录
- 第一章、注释在类上的注解
- 1.1)JUnit5注释在类上的注解
- 集成测试:@SpringBootTest
- 集成测试:@ExtendWith(SpringExtension.class)
- 单元测试:ExtendWith(MockitoExtension.class)
- 切片测试:@WebMvcTest和@DataJpaTest
- <font color=red ><b>手动添加bean到测试上下文:@TestConfiguration
- 1.2)JUnit4类上的注解简单介绍
- JUnit4集成测试:@RunWith(SpringJUnit4ClassRunner.class)
- JUnit4单元测试:@RunWith(MockitoJUnitRunner.class)
- 第二章、注释在成员变量上的注解
- 2.1)模拟依赖注入
- @Mock
- @MockBean
- @Spy
- 2.2)注入真实的bean
- @Autowired
- @Captor
- 2.3)模拟注入被测试类的实例:@InjectMocks
- @InjectMocks
- 避免@Autowired和@InjectMock同时使用
- 第三章、注释在方法上的注解
- 3.1)标记测试
- @Test:标记测试方法
- @ParameterizedTest:参数化测试
- @RepeatedTest:多次重复进行测试
- 3.2)标记测试顺序
- @BeforeEach:指定在每个测试方法运行之前执行的方法。
- @AfterEach:指定在每个测试方法运行之后执行的方法。
- @BeforeAll:指定在所有测试方法运行之前执行的方法。
- @AfterAll:指定在所有测试方法运行之后执行的方法。
- 3.3)其他注解
- @Disabled:指定禁用测试方法或测试类。
- @DisplayName:显示测试名称
- @Tag:指定测试方法的标签。
友情提醒:
先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。有用记得关注
第一章、注释在类上的注解
1.1)JUnit5注释在类上的注解
集成测试:@SpringBootTest
用于加载整个应用程序上下文的注解
@SpringBootTest注解:用于指定Spring Boot应用程序的集成测试。
会加载完整的Spring应用程序上下文,并提供Mock Web Environment,包括所有的bean和配置。
通常用于在JUnit 5中进行Spring Boot应用程序的集成测试。
如果测试时不启动Spring上下文可以进行设置:
//@SpringBootTest(webEnvironment = WebEnvironment.NONE)
//禁用Web环境可以将集成测试转换为更接近于单元测试的测试,而不是测试整个Web应用程序。
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
public class MyIntegrationTest {@Testpublic void testSomething() {// Your test code here}
}
集成测试:@ExtendWith(SpringExtension.class)
@ExtendWith(SpringExtension.class)和@SpringBootTest注解结合使用的效果是在JUnit 5测试中启用Spring的测试框架特性,并且会启动完整的Spring应用程序上下文。
如果你只需要启用Spring支持而不需要加载整个应用程序上下文,可以只单独使用@ExtendWith(SpringExtension.class)。而不使用@SpringBootTest注解,这意味着测试中可以使用Spring的依赖注入、自动装配和其他Spring特性,但无法访问完整的Spring Bean和配置。
单元测试:ExtendWith(MockitoExtension.class)
希望在JUnit 5中使用Mockito框架进行单元测试时可以使用@ExtendWith(MockitoExtension.class)来确保正确的测试环境和行为。以便初始化模拟对象并处理严格的存根。这个扩展类类似于JUnit 4中的MockitoJUnitRunner,它可以在测试类中自动初始化模拟对象,并处理严格的存根。
切片测试:@WebMvcTest和@DataJpaTest
@WebMvcTest用于对Spring MVC控制器进行测试,它会限制测试范围,只会加载与Spring MVC相关的组件,例如控制器、拦截器等,而不会加载整个应用程序上下文。这样可以加快测试速度,并且可以专注于对Web层的测试。
@ExtendWith(SpringExtension.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@Testpublic void testUserController() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/users")).andExpect(MockMvcResultMatchers.status().isOk());}
}
@DataJpaTest用于对JPA持久化层进行测试,它会限制测试范围,只会加载与JPA相关的组件,例如实体类、仓储接口等,而不会加载整个应用程序上下文。这样可以加快测试速度,并且可以专注于对持久化层的测试。
@ExtendWith(SpringExtension.class)
@DataJpaTest
public class UserRepositoryTest {@Autowiredprivate TestEntityManager entityManager;@Autowiredprivate UserRepository userRepository;@Testpublic void whenFindByName_thenReturnUser() {// 测试代码}
}
手动添加bean到测试上下文:@TestConfiguration
作用是告诉Spring框架,在测试环境中,这个配置类中定义的bean应该覆盖主应用程序中相同名称的bean,或者提供测试专用的bean定义。
在测试中,定义了一个@TestConfiguration类,通常情况下,它可以放在与被测试类相同的包结构下用于提供测试专用的bean定义。接着通过@Autowired注解将TestConfig配置类引入测试上下文,从而在测试环境中使用其中定义的bean。
@TestConfigurationstatic class TestConfig {@Beanpublic MyService myService() {return new MyService();}}
通过@Autowired注解将TestConfig配置类引入测试上下文
@SpringBootTest
public class IntegrationTestExample {@Autowiredprivate MyService myService;@Testpublic void testIntegration() {String result = myService.doSomething();assertEquals("expectedResult", result);}}
1.2)JUnit4类上的注解简单介绍
JUnit4集成测试:@RunWith(SpringJUnit4ClassRunner.class)
注意:在JUnit 5中,不再使用@RunWith注解,而是使用更强大的@ExtendWith注解用于扩展测试的行为
@RunWith注解:用于指定JUnit 4测试类的运行器。
可以通过@RunWith注解指定不同的测试运行器,
例如Spring提供的SpringJUnit4ClassRunner
通常用于在JUnit 4中加载Spring上下文进行集成测试。
JUnit4单元测试:@RunWith(MockitoJUnitRunner.class)
注意:告诉JUnit在运行测试时使用Mockito运行器,以便正确处理Mockito的注解和行为,通常用于单元测试中,以便对单个组件进行测试而不涉及外部依赖。
@RunWith(MockitoJUnitRunner.class)
public class YourTestClass {@Testpublic void yourTestMethod() {// Your test method code here}
}
第二章、注释在成员变量上的注解
2.1)模拟依赖注入
@Mock
@Mock:用于模拟依赖项,模拟Spring应用程序上下文中的bean。它会创建一个模拟对象,用于替代应用程序上下文中的真实bean。(mock后真实的方法不再调用)不会执行对象的方法(即使方法报错,test只会使用你设置的返回值,不影响流程)
但用Mockito.when(service.方法名(参数)).thenCallRealMethod();还是可以调真实的方法
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
//模拟注入的依赖项@Mockprivate MyDependency myDependency;@Testpublic void testQueryUserCount(){//待测试的代码。。。
}
}
@MockBean
注解依赖项时,@MockBean注解和@Mock注解的效果是一样的。它们都可以用于模拟依赖项,以便进行单元测试。
@MockBean注解用于模拟Spring应用程序上下文中的bean,并将模拟对象注入到Spring容器中。通常用于模拟service层或repository层的依赖项
@SpringBootTest
public class MyServiceTest {
//MyDependency被用@MockBean注解模拟了,
//可以在不启动Spring Boot应用程序的情况下进行方法的测试。
//也可以使用@Mock注解@MockBeanprivate MyDependency myDependency;@Testpublic void testMyService() {// 测试代码}
}
@Spy
@Spy:用于模拟依赖项,创建一个真实对象的部分模拟。这意味着对象的实际实现将被保留,但您可以选择模拟特定的方法或行为。即会真实的执行对象的方法(如果方法报错,test直接报错)
但用Mockito.doReturn(“不执行此方法”).when(service).方法名(参数);还是可以不调用真实的方法
public class MyServiceTest {@Spyprivate MyDependency myDependency;@Testpublic void testSomething() {// 在这里使用 myDependency 进行测试}
}
2.2)注入真实的bean
@Autowired
用于将实际的Spring bean注入到被测试的类中,以便进行真实的依赖注入。这意味着@Autowired会注入实际的依赖项,而不是模拟对象。
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class MyServiceTest {@Autowiredprivate MyService myService;@Testpublic void testSomething() {// 使用myService进行单元测试}
}
@Captor
@Captor是Mockito框架中的一个注解,用于捕获方法调用时传入的参数,以便在测试中对参数进行断言或验证。
参数捕获:在测试中,使用@Captor可以捕获方法调用时传递的参数,以便在后续的断言中验证参数的值。
参数验证:通过捕获参数,可以对传递给方法的参数进行验证,确保方法得到了期望的参数值。
灵活性:@Captor提供了一种灵活的方式来处理方法调用时的参数,使得测试更加精确和可靠。
// 示例代码中使用@Captor注解捕获参数
@ExtendWith(MockitoExtension.class)
class ExampleTest {@Captorprivate ArgumentCaptor<String> stringCaptor;@Mockprivate SomeClass someClass;@Testvoid testSomething() {// 调用被测试方法someClass.doSomething("test");//verify(someClass)验证someClass对象的doSomething方法是否被调用//@Captor注解创建了一个ArgumentCaptor对象,通过stringCaptor.capture()捕获doSomething方法的参数verify(someClass).doSomething(stringCaptor.capture());//通过stringCaptor.getValue()获取捕获的参数值assertEquals("test", stringCaptor.getValue());}
}
2.3)模拟注入被测试类的实例:@InjectMocks
@InjectMocks
用于创建被测试类的实例,注释的是要测试的实现类并注入模拟对象作为其依赖项。通常用于创建被测试类的实例,并将模拟的依赖项注入到被测试类中,以进行单元测试。
@RunWith(MockitoJUnitRunner.class)
public class UserServiceImplTest {
//需要测试的是UserServiceImpl类,使用 @InjectMocks模拟创建实例@InjectMocksUserServiceImpl userService;
//模拟注入的依赖项@MockUserMapper userMapper;@Testpublic void testQueryUserCount(){//待测试的方法
}
}
避免@Autowired和@InjectMock同时使用
1、在test之前的@BeforeEach注解方法中执行MockitoAnnotations.openMocks(this)
以在每个测试方法之前的初始化操作,包括对Mock对象的初始化。
2、测试的时候要用this.serviceimpl.方法名()测试 否则mock还会使用真实的方法
public class YourTestClass {@InjectMocksprivate YourServiceImpl serviceImpl;@BeforeEachpublic void init() {MockitoAnnotations.openMocks(this);}// 测试方法@Testpublic void testYourServiceMethod() {// 调用被测方法this.serviceImpl.yourServiceMethod();// 断言和验证// ...}
}
第三章、注释在方法上的注解
3.1)标记测试
@Test:标记测试方法
用于标识单元测试方法。JUnit将会执行被@Test注解标记的方法,并对它们进行断言和验证。JUnit 5中的@Test注解使得编写和执行单元测试变得非常简单和直观。
@ParameterizedTest:参数化测试
通过使用 @ParameterizedTest 注解,可以轻松地在单个测试方法中执行多组输入和预期输出的测试。
@ParameterizedTest 注解标记了 testAddition 方法,该方法使用 @CsvSource 提供了多组输入参数。在这个例子中,@CsvSource 提供了三组输入参数,每组参数包括两个加数和预期的结果。在测试方法中,使用提供的输入参数进行计算,并使用断言来验证计算结果是否符合预期。
public class ParameterizedTestExample {@ParameterizedTest@CsvSource({ "1, 1, 2", "2, 3, 5", "5, 5, 10" })void testAddition(int a, int b, int expectedResult) {Calculator calculator = new Calculator();int result = calculator.add(a, b);
//expectedResult期望结果,result实际的计算结果,Lambda表达式,用于生成断言失败时的错误消息。
assertEquals(expectedResult, result, () -> a + " + " + b + " should equal " + expectedResult);}
}
@RepeatedTest:多次重复进行测试
@RepeatedTest 注解用于指定重复测试
public class RepeatedTestExample {
//下面的测试方法将被重复执行五次@RepeatedTest(5)void repeatedTest() {// 测试逻辑assertTrue(true);}
}
3.2)标记测试顺序
@BeforeEach:指定在每个测试方法运行之前执行的方法。
@BeforeEach注解用于标记一个方法,@BeforeEach执行多次,在每个测试方法执行之前都会被执行。这样可以确保在每个测试方法执行前都有一致的初始化操作。
public class ExampleTest {private String message;@BeforeEachpublic void init() {message = "Hello, World!";}@Testpublic void testMessage() {assertEquals("Hello, World!", message);}
}
@AfterEach:指定在每个测试方法运行之后执行的方法。
使用@AfterEach注解的目的是确保在每个测试方法执行之后都有一致的清理操作。这有助于避免测试方法之间的相互影响,以及确保每个测试方法都在一个干净的状态下执行。
public class ExampleTest {private String message;@AfterEachpublic void cleanUp() {message = null;}@Testpublic void testMessage() {message = "Hello, World!";assertEquals("Hello, World!", message);}
}
@BeforeAll:指定在所有测试方法运行之前执行的方法。
@BeforeAll只在第一次运行测试方法时执行一次,后面都不再执行。这意味着它用于执行一次性的全局初始化操作
而@BeforeEach会执行多次,每次运行测试方法都会执行。
public class ExampleTest {private static String message;@BeforeAllpublic static void init() {message = "Hello, World!";}@Testpublic void testMessage() {assertEquals("Hello, World!", message);}
}
@AfterAll:指定在所有测试方法运行之后执行的方法。
@AfterAll注解标记的方法在整个测试类中的所有测试方法都执行之后执行一次,用于执行全局的清理操作。
如果我有4个测试方法,执行了3个,这时候是不会触发@AfterAll注解的方法的。
public class ExampleTest {private static String message;@AfterAllpublic static void cleanUp() {message = null;}@Testpublic void testMessageIsNull() {assertEquals(null, message);}
}
3.3)其他注解
@Disabled:指定禁用测试方法或测试类。
用于禁用单个测试方法或测试类,这意味着被注解的测试方法或测试类将不会被执行。这在临时禁用某些测试时非常有用,例如当测试方法出现问题或需要进行调整时。
public class ExampleTest {@Disabled("This test is currently disabled")@Testvoid disabledTest() {// Test logic that should be disabled}@Testvoid enabledTest() {// Test logic that should be enabled}
}
@DisplayName:显示测试名称
@DisplayName(“Custom Test Name”) 用于指定测试方法的显示名称为 “Custom Test Name”。这个显示名称将会在测试报告、IDE中的测试运行结果以及构建工具(如Gradle、Maven)生成的测试报告中显示。
public class DisplayNameExample {@Test@DisplayName("Custom Test Name")void customTestName() {// 测试逻辑assertEquals(2, 1 + 1);}
}
@Tag:指定测试方法的标签。
在JUnit 5中,使用@Tag注解在测试方法添加标签,也可以为整个测试类添加@Tag注解标签,以便更好地组织和筛选测试。
@Tag("development")
public class ExampleTest {@Test@Tag("unit")void test1() {// 测试方法1的测试逻辑}@Test@Tag("integration")void test2() {// 测试方法2的测试逻辑}
}
通过为测试方法或测试类添加标签,可以更轻松地选择性地运行特定标签的测试,或者排除特定标签的测试。使用Maven在命令行中:
mvn test -Dgroups=tagName
//实例:
mvn test -Dgroups=unit
通过Maven Surefire插件配置选择性运行标签的测试:在maven-surefire-plugin的groups,如果要运行标签为"tagName"的测试,可以将groups参数设置为"tagName"。再执行mvn test命令将会根据配置运行具有指定标签的测试。
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><groups>tagName</groups></configuration></plugin></plugins>
</build>
相关文章:
JUnit5单元测试框架提供的注解
目录 第一章、注释在类上的注解1.1)JUnit5注释在类上的注解集成测试:SpringBootTest集成测试:ExtendWith(SpringExtension.class)单元测试:ExtendWith(MockitoExtension.class)切片测试:WebMvcTest和DataJpaTest<font colorred…...
ThinkPHP 中使用Redis
环境.env [app] app_debug "1" app_trace ""[database] database "" hostname "127.0.0.1" hostport "" password "" prefix "ls_" username ""[redis] hostname "127.0.0.1…...
Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在使用 Gin 框架处理前端请求数据时,必须关注安全性问题,以防范常见的攻击…...
MySQL数据库基础与SELECT语句使用梳理
MySQL数据库基础与SELECT语句使用梳理 注意:本文操作全部在终端进行 数据库基础知识 什么是数据库 数据库(database)是保存有组织的数据的容器(通常是一个文件或一组文件),实质上数据库是一个以某种 有组…...
scikit-learn 1.3.X 版本 bug - F1 分数计算错误
如果您正在使用 scikit-learn 1.3.X 版本,在使用 f1_score() 或 classification_report() 函数时,如果参数设置为 zero_division1.0 或 zero_divisionnp.nan,那么函数的输出结果可能会出错。错误的范围可能高达 100%,具体取决于数…...
Python面试题19-24
解释Python中的装饰器(decorators)是什么,它们的作用是什么? 装饰器是一种Python函数,用于修改其他函数的功能。它们允许在不修改原始函数代码的情况下,动态地添加功能。解释Python中的文件处理(…...
《Django+React前后端分离项目开发实战:爱计划》 01 项目整体概述
01 Introduction 《Django+React前后端分离项目开发实战:爱计划》 01 项目整体概述 Welcome to Beginning Django API wih React! This book focuses on they key tasks and concepts to get you started to learn and build a RESTFul web API with Django REST Framework,…...
从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能
前言 学习资料: TensorRT 源码示例 B站视频:TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码:cookbook → 07-Tool → trtexec 官方文档:trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…...
基于SpringBoot+Vue的校园博客管理系统
末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…...
基于 SpringBoot 和 Vue.js 的权限管理系统部署教程
大家后,我是 jonssonyan 在上一篇文章我介绍了我的新项目——基于 SpringBoot 和 Vue.js 的权限管理系统,本文主要介绍该系统的部署 部署教程 这里使用 Docker 进行部署,Docker 基于容器技术,它可以占用更少的资源,…...
Redis篇之集群
一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据同…...
JUnit 5 注解总结与解析
前言 大家好,我是chowley,通过前篇的JUnit实践,我对这个框架产生了好奇,除了断言判断,它还有哪些用处呢?下面来总结一下它的常见注解及作用。 正文 在Java单元测试中,JUnit是一种常用的测试框…...
CSS综合案例4
CSS综合案例4 1. 综合案例 我们来做一个静态的轮播图。 2. 分析思路 首先需要加载一张背景图进去需要4个小圆点,设置样式,并用定位和平移调整位置添加两个箭头,也是需要用定位和位移进行调整位置 3. 代码演示 html文件 <!DOCTYPE htm…...
WifiConfigStore初始化读取-Android13
WifiConfigStore初始化读取 1、StoreData创建并注册2、WifiConfigStore读取2.1 文件读取流程2.2 时序图2.3 日志 1、StoreData创建并注册 packages/modules/Wifi/service/java/com/android/server/wifi/WifiConfigManager.java mWifiConfigStore.registerStoreData(mNetworkL…...
【Spring源码解读!底层原理进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀…...
从零开始手写mmo游戏从框架到爆炸(六)— 消息处理工厂
就好像门牌号一样,我们需要把消息路由到对应的楼栋和楼层,总不能像菜鸟一样让大家都来自己找数据吧。 首先这里我们参考了rabbitmq中的topic与tag模型,topic对应类,tag对应方法。 新增一个模块,专门记录路由eternity-…...
Go基础学习笔记-知识点
学习笔记记录了我在学习官方文档过程中记的要点,可以参考学习。 go build *.go 文件 编译 go run *.go 执行 go mod init 生成依赖管理文件 gofmt -w *.go 格式换名称的大小写用来控制方法的可见域主方法及包命名规范 package main //注意package的命名࿰…...
jvm几个常见面试题整理
1. Full GC触发机制有如下5种情况。 (1)调用System.gc()时,系统建议执行Full GC,但是不必然执行。(2)老年代空间不足。(3)方法区空间不足。(4)老年代的最大可用连续空间小于历次晋升到老年代对象的平均大小就会进行Full GC。(5)由Eden区、S0(From)区向S…...
ReentrantLock 和 公平锁
ReentrantLock 和 公平锁 一、基本介绍 ReentrantLock(重入锁) 是一个独占式锁,具有和synchronize的监视器锁基本相同的行为和语意。但和synchronized相比,它更加的灵活、强大、增加了轮询、超时、中断等高级功能以及可以创建公平和非公平锁。Reentran…...
使用Postman做API自动化测试
Postman最基本的功能用来重放请求,并且配合良好的response格式化工具。 高级点的用法可以使用Postman生成各个语言的脚本,还可以抓包,认证,传输文件。 仅仅做到这些还不能够满足一个系统的开发,或者说过于琐碎&#…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
