月度记录-2025-1月

75 阅读5分钟

1. springframework.boot中@ConfigurationProperties

注意:这个注解,加了之后nacos配置如果修改了,会自动刷新。

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "a.b.c")
public class XXXConfig {
    private Long userId;
}

2. @EventListener和事务

如果某个方法加了@Transactional,然后在方法的最后发了个事件,事件监听用@EventListener,而监听器,放到mq中一个任务,会发生什么?

待验证:由于事务是在方法结束之后提交的,如果方法的事务提交的特别慢,而mq中的任务消费的非常快,可能就会出现事务还没有提交,但是mq消费到了任务,和预期可能会不符。消费者看不到数据的最新状态。

3. select * from information_schema.innodb_trx;

查询当前活跃事务

4. mysql innodb 事务有哪些状态?

1. 活动状态(Active)

  • 含义:事务正在执行中,尚未提交或回滚。

  • 特点:

  • 事务已开始(BEGIN 或隐式启动)。

  • 正在执行 SQL 操作(如 INSERT、UPDATE、SELECT)。

  • 持有相关的锁(如行锁、间隙锁等)。

  • 转换:

  • 如果事务执行完成所有操作并调用COMMIT,进入部分提交状态。

  • 如果发生错误或显式调用 ROLLBACK,进入失败状态。

2. 部分提交状态(Partially Committed)

  • 含义:事务已执行 COMMIT 命令,但尚未将修改持久化到磁盘(未完成最终的日志写入)。

  • 特点:

  • InnoDB 的提交分为两个阶段:

3. 提交状态(Committed)

  • 含义:事务已成功提交,修改已持久化到磁盘。

  • 特点:

  • 所有 Redo Log 已刷盘。

  • 数据修改对其他事务可见(根据隔离级别)。

  • 释放事务持有的锁(除非是长事务或存在其他依赖)。

  • 转换:事务生命周期结束。

4. 失败状态(Failed)

  • 含义:事务执行过程中发生错误(如死锁、违反约束、显式回滚等),无法继续执行。

  • 特点:

  • 事务未完成预期操作。

  • 可能仍持有部分锁。

  • 转换:

  • 自动或手动调用ROLLBACK,事务进入中止状态。

5. 中止状态(Aborted)

  • 含义:事务已回滚,所有修改被撤销。

  • 特点:

  • 使用 Undo Log(回滚日志)撤销已做的修改。

  • 释放所有持有的锁。

  • 转换:事务生命周期结束。

6. 隐式提交状态(Implicitly Committed)

  • 含义:某些操作会导致隐式提交(即使未显式调用 COMMIT)。

  • 触发条件:

  • 执行 DDL 语句(如 CREATE TABLE、ALTER TABLE)。

  • 设置 autocommit = 1 时,每条 SQL 语句自动提交。

  • 执行某些管理命令(如LOCK TABLES)。

  • 特点:隐式提交后,事务进入提交状态。

关键注意事项

  1. 锁的释放:

  2. Redo Log 与持久化:

  3. Undo Log 与回滚:

5. 抛出异常,俩参数,一个记录日志给开发看,另一个展示给用户

以前做的项目抛异常都只有一个参数,记录到日志中的和给用户看到的是一样的,想看一些导致异常的数据,需要自己打印日志。其实并不好,开发看到的和用户看到的不应该一样,分为两个参数就很好。

6. 本地敏感词校验和图片校验

问题:如果用户发布的是文章,1000字。怎么做敏感词校验?

至于图片,那就是CV领域的事了。

7. StateMachineBuilder

本来想用它来做打卡,但是没用上。简单了解了一下,以后可以用来做比较复杂的流程流转,比如订单流转。

8. Haversine 公式计算经纬度之间的距离

Haversine公式可以用来计算地球表面两点之间的最短距离,基于经纬度来计算。在实际应用中,考虑到地球并非完美球体,Haversine公式计算的是地球表面上的大圆距离(即沿球面最短路径)。

做个打卡,够用了。

9. ApplicationEventPublisher.publishEvent()

发出去的事件,执行的时候其实还是在一个线程内的,那么如果一个事件有多个监听,会先执行哪个监听呢?

  • 如果没有显式指定顺序,监听器会按照它们在容器中注册的顺序依次执行。

  • 使用 @Order 注解或者实现 Ordered 接口可以明确指定事件监听器的执行顺序。

  • 如果某些监听器使用了 @Async 注解,它们的执行顺序可能会受到线程调度的影响。

10. stream().reduce

  • reduce() 是一种强大的工具,用来将流中的所有元素聚合成一个单一的结果。

  • 它适用于各种聚合任务,比如求和、求积、连接字符串、找到最大值/最小值等。

  • 使用 identity 参数时,返回值不为 Optional,适合流为空的情况。

    BigDecimal totalWorkHours = new BigDecimal(0); for (Map.Entry<Integer, BigDecimal> entry : workHourMap.entrySet()) { BigDecimal value = entry.getValue(); totalWorkHours = totalWorkHours.add(value); }

    BigDecimal totalWorkHours = workHourMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);import java.util.Arrays; import java.util.List;

    public class ReduceExample { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用 reduce 找出最大值
        int max = numbers.stream()
                         .reduce(Integer::max)
                         .orElseThrow(() -> new IllegalArgumentException("List is empty"));
        
        System.out.println("Max: " + max); // 输出: Max: 5
    }
    

    }

11. Trie树(前缀树)

‌Trie树‌,也称为“字典树”或“前缀树”,是一种树形结构,专门用于处理字符串匹配问题。Trie树通过利用字符串之间的公共前缀来减少查询时间,从而提高查询效率。特别适合用于敏感词检测。

查找时间复杂度:查找时间复杂度为 O(m),其中 m 为待查找字符串的长度。