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

2025-01学习笔记

1.SpEL

第一次知道它的全称

Spring Expression Language(SpEL)

@Value("${my.property}") 
private String myProperty; 

@Value("#{2 * 3}") 
private int computedValue;

2.逃逸分析

逃逸分析:当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。

栈上分配
将堆分配转化为栈分配。如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。可以减少垃圾回收时间和次数。

堆内存参数设置也是系统优化的一项

调整堆大小,提高服务的吞吐量

可以减小full gc次数(因为full gc要stop the world)

Young GC 通常比较高效,且不会影响到整个堆内存的清理。它只会暂停应用的执行片刻(暂停时间较短),影响较小。

Full GC 会清理年轻代、老年代和方法区的垃圾。它通常是一次 "慢" 的 GC,因为涉及的内存范围广,需要清理的对象较多。

3.Mybatis的二级缓存

Mybatis一级缓存默认开启,二级缓存默认不开启

二级缓存作用范围是同一个xml

二级缓存适合以下场景:
静态数据查询:
数据变化频率低,实时性要求不高的场景,比如配置表、字典表等。

不建议开启二级缓存的场景
数据更新频繁:
数据实时性要求高或频繁更新的场景,例如订单、库存等动态数据。

建议开启:数据更新不频繁,主要是静态数据或基础数据的场景。
数据库读操作压力大且查询结果重复性高。
建议关闭或慎用:数据实时性要求高、更新频繁,或者存在多服务修改数据的场景。

4.字符串

1.字符串的对象也是不可变对象,意味着一旦进行修改,就会产生新对象。
2.String对象内部是用字符数组进行保存的。"abc" 等效于 char[] data={ 'a' , 'b' , 'c' }

//例如: 
String str = "abc";

//相当于: 
char data[] = {'a', 'b', 'c'};     
String str = new String(data);
// String底层是靠字符数组实现的。

5.Spring的代理

如果目标对象实现了接口,Spring 默认使用 JDK 动态代理

目标类没有实现接口时,Spring 会选择 CGLIB 动态代理。

AOP
事务:

Spring 的事务管理基于 AOP 动态代理。当事务方法被直接调用(例如通过 this.method())时,不经过 Spring 的代理,事务功能会失效。
@Async都要用到代理

MyBatis 在运行时使用了 JDK 动态代理 来为 Mapper 接口生成实现类。
为什么使用 JDK 动态代理?MyBatis 的 Mapper 必须是一个接口。
JDK 动态代理可以根据接口生成代理对象,并拦截方法调用,将其委托给 MyBatis 的核心执行逻辑(如 SQL 执行、参数绑定等)。

6.@RestControllerAdvice 和 @ControllerAdvice

@RestControllerAdvice 和 @ControllerAdvice 的适用范围相同,都会捕获被 @Controller 和 @RestController 修饰的控制器的异常。

7.Redis分布式锁

这是对上一篇博客的简化版

用一个key,然后在那里while循环就行了,只要在时间范围内就一直while

不需要像上一篇一样用两个key

上一篇是必须用公平锁的情况

/**
 * 获取分布式公平锁
 *
 * @param timeout     锁的过期时间
 * @param leaseTime   锁持有的最大时间
 * @param timeUnit    时间单位
 * @param sequenceKey 锁状态
 * @return 是否成功获取锁
 */
public boolean tryLock(long timeout, long leaseTime, TimeUnit timeUnit, String sequenceKey) {
    // 获取锁的超时时间
    long startTime = System.currentTimeMillis();

    try {
        // 不断检查是否是队列中的第一个(即最早请求的线程)
        while (System.currentTimeMillis() - startTime < timeUnit.toMillis(timeout)) {
            // 如果当前线程是队列中的第一个,则成功获取锁
            Boolean success = redisTemplate.opsForValue().setIfAbsent(sequenceKey, sequenceKey, leaseTime, timeUnit);
            if (success != null && success) {
                // 设置锁过期时间
                //redisTemplate.expire(lockKey, leaseTime, timeUnit);
                return true; // 获取锁成功
            }
            // 等待一段时间后重试
            Thread.sleep(100);
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        return false;
    }
    return false; // 超时未获取锁
}

/**
 * 释放分布式公平锁
 *
 * @param sequenceKey 锁状态
 */
public void unlock(String sequenceKey) {
    // 释放锁
    redisTemplate.delete(sequenceKey); // 删除锁状态
}

8.for中可以remove

从后往前循环,可以在for中remove
从前往后不可以,因为从前往后会发生索引得变化

 9.@Cacheable存储,会多一个冒号

@Cacheable(value = "Test", key = "'V2:' + #dto.userId + '_' + #dto.userLocation") 
为什么存入redis的key多了一个冒号
Test::V2:123456_HK

在 Spring Cache 中,使用 @Cacheable 注解时,生成的 Redis 键会包含一个冒号 : 是由 Spring Cache 默认的 缓存命名策略(KeyGenerator)决定的。 

Spring Cache 的默认实现使用了 Redis的 cacheKeyPrefix 策略,会在 value 后加一个:作为分隔符,以区分不同的缓存命名空间和具体键,

所以最好还是用@CacheEvict去删除

10.为什么一般不在yml中配置线程池参数

在 Spring Boot 的 application.yml 中配置线程池时,的确 无法直接配置拒绝策略。

所以一般都@Bean的形式去配置

Spring 的默认线程池拒绝策略是 AbortPolicy。
AbortPolicy:
默认策略:当线程池无法处理任务(例如,线程池已满并且队列也已满),AbortPolicy 会抛出一个 RejectedExecutionException 异常,表示当前任务无法被执行。

11.自定义注解中可以配置一些属性,然后在切面中获取

import java.lang.annotation.*;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
    String type() default "";
    String module() default "";
    String content() default "";
}
    @GetMapping
    @LogAnnotation(module="登录",content="用户登录",type="1")
    public String login(){
        
    }

12.mysql的日志

1.redo

redo日志,重做,保证持久性
会记录当前事务执行到哪一句了,等系统恢复后,在这一句继续往下执行,保证了持久性

2.undo

undo日志,不做,保证原子性
在执行每条sql的时候都会产生一条相反的sql,在回滚的之后就执行相反的sql,保证原子性

3.binlog

binlog,主从复制,主主复制

写操作:只有涉及数据库修改的数据操作(INSERT、UPDATE、DELETE 等)才会被记录到 Binlog 中。查询操作(SELECT)是不会被记录在 Binlog 中的,因为它们不会改变数据库状态。
事务提交:对于事务操作,只有当事务提交时,才会把事务中的操作记录到 Binlog。也就是说,Binlog 记录的是事务的最终结果。

13.nacos改什么配置都会立即生效吗

不是

如果某些配置只有在初始化时加载(如数据库连接池配置),需要重新启动应用或重建资源来应用新配置。

14.yyyy

日期格式中,yyyy和YYYY含义不同,yyyy才是正解

15.Mybatis获取结果集

16.数据库中的char型

小心它的自动填充

 

17.前缀索引

 

 


http://www.kler.cn/a/514758.html

相关文章:

  • PAT (Basic Level) Practice 乙级1041-1045
  • MyBatis和JPA区别详解
  • [Dialog屏幕开发] 屏幕绘制(文本/输入框/按钮控件)
  • Redis的Windows版本安装以及可视化工具
  • 第3天:阿里巴巴微服务解决方案概览
  • 你还在用idea吗
  • 物联网常见的传感器和执行器-带表格整理
  • 多线程之旅:开启多线程安全之门的钥匙
  • 如何使用CRM数据分析优化销售和客户关系?
  • 【搞机】GMK-G3因特尔n100处理器核显直通win10虚拟机
  • 如何有效使用Python爬虫将网页数据存储到Word文档
  • 机器学习实战第一天:LSTM(长短时记忆网络)
  • Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录
  • C语言初阶牛客网刷题——JZ17 打印从1到最大的n位数【难度:入门】
  • 【JavaSE】(8) String 类
  • 计算机怎么入门
  • 动态规划(DP)(细致讲解+例题分析)
  • ChatGPT接入苹果全家桶:开启智能新时代
  • HBased的原理
  • HDBaseT和KVM 和POE是怎么融合在一块的
  • 国产编辑器EverEdit - 文件列表
  • 08-Elasticsearch
  • 区块链的数学基础:核心原理与应用解析
  • ImportError: cannot import name ‘datapoints‘ from ‘torchvision‘
  • # [Unity]【游戏开发】 脚本生命周期与常见事件方法
  • 局域网中 Windows 与 Mac 互相远程连接的最佳方案