java后端工程师+AI大模型开发进修ing(研一版‖day62)

今日总结

  • java随笔录------什么是接口幂等性,在MySQL中,如何定位慢查询,索引
  • AI随探录------
  • 代码随想录------子集 ||,非递减子序列,全排列

目录

今日总结

详细内容

java随笔录

[1. 什么是接口幂等性](#1. 什么是接口幂等性)

定义

触发的情景

在高并发情况下,实现幂等性面对的挑战

解决方案

如何保障数据库层面的线程安全

2.在MySQL中,如何定位慢查询

3.这个SQL执行很慢,如何优化分析的呢?

4.了解过索引吗,什么是索引

AI随探录

代码随想录

[子集 ||](#子集 ||)

非递减子序列

全排列


详细内容

java随笔录

1. 什么是接口幂等性

定义

同一个请求执行一次和执行多次的效果完全相同,重复调用不会产生副作用。在分布式系统中,幂等性是保证数据一致性的重要手段。

触发的情景
  1. 网络重试:网络异常导致的请求重发
  2. 用户重复操作:用户多次点击提交按钮
  3. 系统故障恢复:服务重启后的请求重发
  4. 消息队列重复消费:MQ消息的重复投递
在高并发情况下,实现幂等性面对的挑战
  1. 竞态条件:多个线程同时检查和修改状态
  2. 性能要求:幂等性检查不能成为性能瓶颈
  3. 存储一致性:分布式环境下的状态同步
  4. 资源竞争:优先的锁资源和数据库连接
解决方案
  1. 基于唯一标识的方案:为每个请求生成一个唯一标识,通过标识去重。首先客户端利用UUID、雪花算法等生成唯一ID,服务端对ID进行校验。要保证原子操作,使用数据库唯一约束或redis setnx操作(SETNX 操作是原子性的 。这一特性由Redis的单线程架构和命令执行机制保证。同一时刻只有一个命令在执行,天然避免并发冲突。)
  2. 基于业务状态的方案:利用业务数据的状态变化来保证幂等性。典型场景:订单状态:已支付的订单不能重复支付;库存扣减:基于版本号的乐观锁机制;账户余额:基于当前余额的条件更新;状态机:严格的状态流转控制。 这种方案与业务完美结合,省去不必要的开销
如何保障数据库层面的线程安全
  1. 悲观锁方案(在SQl查询语句中加入 for updata 指示数据库对查询结果集中的记录加排他锁(X 锁))和乐观锁方案(设置版本号id字段,利用版本号控制,适用读多写少)
  2. 在分布式环境下,需要用redis分布式锁(setNX+expire 原子性获取锁并设置过期时间)或ZooKeeper分布式锁方案
    优化策略:将幂等性检查与业务分离,进行异步处理;缓存预热:批量操作,减少数据库操作次数
    容错机制:降级策略:幂等性检查失败时的一个备选方案;补偿机制:异常情况下的数据修复;限流保护:防止大量重复请求冲击系统。

2.在MySQL中,如何定位慢查询

1. 开源工具
调试工具:Arthas
运维工具:Prometheus、Skywalking
2、MySQL自带慢日志(调试阶段)
慢查询记录了所有执行时间超过指定参数的所有SQL语句的日志,如果要开启慢查询日志,需要在MySQL的配置文件中配置信息

业务场景 :比如可以说"在我们的电商业务中,用户在进行商品搜索时,系统响应时间明显变长,出现了慢查询的情况。这个业务模块涉及到大量的商品数据以及用户搜索条件的匹配,对系统性能要求较高。"
解决方案

  • 优化 SQL 语句:对于复杂的关联查询,通过调整查询逻辑、减少不必要的子查询等方式进行优化。例如,将原来的嵌套子查询改为连接查询,提高了查询效率。
  • 索引优化:根据 EXPLAIN 分析结果,创建或修改索引。对于经常作为查询条件的字段,创建合适的索引。如在商品表的 category_id 和 price 字段上创建联合索引,大大提高了按分类和价格范围查询的速度。

3.这个SQL执行很慢,如何优化分析的呢?

答:可能以下情况造成

  1. 聚合查询
  2. 多表查询
  3. 表数据量过大查询(应添加索引)
    首先采用慢查询日志,可以快速定位到执行慢的语句,之后采用MySQL自带的分析工具EXPLAIN,执行 enplain selecty语句;通过查看possible_key和key的值,来判断是否使用了索引。Extra字段的值的含义如下

    解决方案:
    优化查询语句
  • 建议内容:对查询语句进行优化,避免使用不必要的子查询、避免全表扫描、合理使用连接等。
    实际操作方式 :将子查询转换为连接查询,使用索引来避免全表扫描。
    创建合适的索引
  • 建议内容:根据查询条件和排序字段创建合适的索引。
    索引并不是越多越好,过多的索引会增加插入、更新和删除操作的时间,因为每次数据变更都需要更新索引。
    优化表结构
  • 建议内容:对表结构进行优化,如拆分大表、合理设计字段类型等。

4.了解过索引吗,什么是索引

答:索引是提高MySQL快速查询的一种有序地数据结构。索引就采用了B+树的数据结构,
索引是对数据库表中一列或多列的值进行排序的一种结构。它存储了表中某些列的值以及这些值对应的行在磁盘上的物理地址(指针)。数据库在执行查询时,会先在索引中查找符合条件的值,然后根据索引中记录的物理地址直接访问对应的数据行,而不是逐行扫描整个表,从而大大提高查询效率。
常见的索引如下:

  1. 主键索引 :是一种特殊的唯一索引,不允许有空值。每个表只能有一个主键索引,它用于唯一标识表中的每一行数据。
  2. 唯一索引 :要求索引列的值必须唯一,但允许有空值。如果在某个列上创建了唯一索引,那么该列中不会出现重复的值。
  3. 普通索引 :最基本的索引类型,它没有任何限制,主要用于提高查询速度。
  4. 复合索引 :是指在多个列上创建的索引,也称为联合索引。复合索引可以提高多条件查询的效率,遵循最左前缀原则。例如,对于联合索引(col1, col2, col3),查询WHERE col1 = 'value1' AND col2 = 'value2'可以使用该索引,但查询WHERE col2 = 'value2' AND col3 = 'value3'则无法使用该索引。
  5. 全文索引 :主要用于在文本类型的列上进行全文搜索,如文章内容、产品描述等。

    圈1:因为分支节点只存储指针,不存储数据,数据都存储在了叶子节点。
    圈2:因为数据全在叶子结点,所以查询到的数据时间比较均衡
    圈3:当查询某个数据时,会根据分支的区间范围查找到对应的数据,同时叶子节点的数据支持双向链表查询,在找到该数据的同时,可以区间查询到其他数据。

AI随探录

代码随想录

子集 ||

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

复制代码
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

复制代码
输入:nums = [0]
输出:[[],[0]]

注意去重方法

java 复制代码
class Solution {

    List<List<Integer>> result = new ArrayList<>();
    List<Integer> path = new LinkedList<>();

    private void back(int[] nums, int ids, int[] flag) {
        result.add(new ArrayList(path));
        if(ids == nums.length) {
            return;
        }
        for(int i = ids; i < nums.length; i++) {
            if(i > 0 && nums[i] == nums[i - 1] && flag[i - 1] == 0)
            continue;
            path.add(nums[i]);
            flag[i] = 1;
            back(nums, i + 1,flag);
            flag[i] = 0;
            path.removeLast();
        }
    }

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        int[] flag = new int[100000];
        back(nums,0,flag);
        return result;
    }
}

非递减子序列

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:

复制代码
输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:

复制代码
输入:nums = [4,4,3,2,1]
输出:[[4,4]]
java 复制代码
class Solution {

    List<List<Integer>> result = new ArrayList<>();
    List<Integer> path = new LinkedList<>();

    private void back(int[] nums,int ids ) {
        if(path.size() >= 2) {
            result.add(new ArrayList<>(path));
        }
        int[] flag = new int[100000];
        for(int i = ids; i < nums.length; i++) {
           if(!path.isEmpty() && nums[i] < path.get(path.size() - 1) || flag[nums[i] + 100] == 1) {
            continue;
           }
           path.add(nums[i]);
           flag[nums[i] + 100] = 1;
           back(nums, i + 1);
           path.removeLast();
        }
    }

    public List<List<Integer>> findSubsequences(int[] nums) {
      
        back(nums,0);
        return result;
    }
}

全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

复制代码
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

复制代码
输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

复制代码
输入:nums = [1]
输出:[[1]]
java 复制代码
class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> path = new LinkedList<>();
    int[] used = new int[1000000];
    private void back(int[] nums) {
        
        if(path.size() == nums.length) {
            result.add(new ArrayList<>(path));
            return ;
        }
        
        for(int i = 0 ; i < nums.length; i++) {
            if(used[i] == 1)
            continue;
            path.add(nums[i]);
            used[i] = 1;
            back(nums);
            used[i] = 0;
            path.removeLast();
        }
    }

    public List<List<Integer>> permute(int[] nums) {
        if (nums.length == 0){
            return result;
        }
        back(nums);
        return result;
    }
}
相关推荐
利刃大大1 小时前
【JavaSE】十、ArrayList && LinkedList
java·链表·数组
lsx2024061 小时前
PHP 可用的函数
开发语言
Qiuner1 小时前
Spring 机制六: MVC 全链路源码解析:从 DispatcherServlet 到返回值解析(超硬核源码深度)
java·spring boot·后端·spring·mvc
子一!!1 小时前
并查集(Union-Find)数据结构
java·数据结构·算法
阿正的梦工坊1 小时前
R-Zero:从零数据自进化推理大语言模型
人工智能·算法·语言模型·大模型·llm
Evand J1 小时前
【信号处理课题推荐】小波变化:原理、演进与时频分析应用,MATLAB代码示例
算法·matlab·信号处理·傅里叶分析·傅立叶分析·小波变化
哈库纳玛塔塔1 小时前
MongoDB 数据库 ORM/ODM 新工具
java·数据库·spring boot·mongodb·orm
2401_841495641 小时前
【LeetCode刷题】轮转数组
数据结构·python·算法·leetcode·数组·双指针·轮转数组
小满、1 小时前
Redis:GUI 客户端(Redis Insight / Tiny RDM)、基础操作、Spring Boot 连接实现
java·redis·缓存·redis insight·tiny rdm