每日学习-02

问题一:你CompletableFuture怎么用的?

问题二:为什么用自定义线程池?

问题三:你部署了吗?知道哪些部署方式

问题四:Redisson可重入锁怎么实现的

问题五:你用过什么mybatis插件

问题一:你CompletableFuture怎么用的?

我在项目里用 CompletableFuture 做多任务异步并行处理,主要分这几块说:

  1. 创建异步任务 用 supplyAsync 执行有返回值的任务、runAsync 执行无返回值任务,还能指定自定义线程池,避免用默认 ForkJoinPool。
  2. 任务编排组合
  • thenApply/thenAccept:单个任务完成后串行执行后续逻辑;
  • thenCombine:两个独立异步任务全部完成,再合并两者结果;
  • anyOf:只要任意一个任务完成就往下走,allOf 需要所有任务全部结束;
  1. 异常处理 用 exceptionally 捕获异步任务抛出的异常,给兜底返回值,或者 handle 同时处理正常结果和异常,防止单个任务异常阻塞整体流程;
  2. 实际业务场景 比如我做后台数据统计时,并行查订单、用户、商品三张表的数据,用多个 CompletableFuture 同时发起查询,最后等全部完成再组装返回,相比单线程串行查询大幅缩短接口响应时间,最后用 get () 阻塞拿到最终结果。问题二:为什么用自定义线程池?

问题二:为什么用自定义线程池?

我简单说下为什么要用自定义线程池:

  1. 避免使用 Executors 默认线程池的隐患,比如无界队列会堆积大量请求,容易 OOM;
  2. 可以根据业务调整核心线程、最大线程、队列、拒绝策略,贴合项目并发量,资源可控;
  3. 统一管理线程,给线程命名方便日志排查线上问题;
  4. 配合 CompletableFuture 这类异步工具,复用线程,减少频繁创建销毁线程的开销;
  5. 不同业务隔离线程池,比如 IO 查询、文件处理分开,一个业务阻塞不会拖垮其他异步任务。

问题三:你部署了吗?知道哪些部署方式

我自己项目做过部署,常见几种部署方式我都了解:

  1. 传统服务器部署:把 Maven 打包好的 jar 包上传 Linux,用 java -jar 命令运行,搭配 nohup 或者 systemd 设置开机自启,适合小型项目。
  2. Docker 容器部署:编写 Dockerfile 构建镜像,用 docker run 启动容器,环境统一,不会出现本地和线上环境不一致的问题。
  3. Docker Compose:多服务项目,比如同时启动 Redis、MySQL、后端服务,用 compose 文件一键编排启动,本地测试或者单机部署很方便。
  4. K8s 部署:企业线上常用,通过 yaml 文件管理 Pod、服务、扩容策略,支持自动扩缩容、滚动更新,适合集群高并发项目。
  5. 云平台一键部署:比如阿里云、腾讯云应用平台,上传 jar 或者镜像就能自动部署,不用手动操作服务器,还自带监控告警。

我自己毕业设计项目是用 Docker 部署到阿里云服务器上的。

问题四:Redisson可重入锁怎么实现的

Redisson 可重入锁是基于 Redis 哈希结构实现的:

  1. 锁 key 是业务锁名,value 是一个 hash,key 存当前线程标识,value 记录该线程加锁次数;
  2. 第一次加锁:不存在这个 key 就创建 hash,线程计数设为 1;
  3. 同一线程再次加锁:匹配到相同线程标识,直接计数 + 1,不用等待;
  4. 解锁:先把计数减 1,计数大于 0 只重置过期时间,计数为 0 才删除整个锁 key;
  5. 底层用 Lua 脚本保证加锁、解锁、计数修改的原子性,防止并发数据错乱。

问题五:你用过什么mybatis插件

我项目里最常用的是 MyBatis-Plus 自带的分页插件,还有自定义的乐观锁插件,另外也了解过分页、性能监控类插件:

  1. 分页插件 PaginationInnerInterceptor 不用自己写分页 SQL,直接调用 Page 对象就能自动拼接 limit 语句,简化分页查询开发,适配 MySQL 等多种数据库。
  2. 乐观锁插件 OptimisticLockerInnerInterceptor 给表加 version 版本字段,更新时自动携带版本号条件,更新成功 version 自增,并发更新冲突时直接更新行数为 0,实现乐观锁防超卖,不用手动写判断逻辑。
  3. 额外用过第三方 / 自定义插件: 一是 SQL 性能监控插件,拦截 SQL 打印执行耗时,慢 SQL 会输出日志方便优化; 二是自定义字段填充插件,自动给创建时间、更新时间、操作人赋值,省去每次手动 set。
相关推荐
xian_wwq4 小时前
【学习笔记】-深度认知系列-第2讲-大模型到底是什么?——拆解“参数、训练、推理”
笔记·学习·深度认知
lzhdim6 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
那年窗外下的雪.7 小时前
AIDC 学习日志|第 15 天|EVPN 多归属故障收敛与撤销机制
网络·学习·php
M78佐菲8 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
我命由我1234510 小时前
人脸识别 - 勒克斯(光线照射到物体表面上的明亮程度)
android·java·学习·java-ee·人脸识别·学习方法·android runtime
Logintern0911 小时前
【每天学习一点点】MPI是什么?
学习·mpi·多机训练
fengci.11 小时前
提示词注入学习小结
学习
晓梦林11 小时前
Tools2靶场学习笔记
笔记·学习
paopaokaka_luck13 小时前
基于springboot3+vue3的车间生产管理系统(Echarts图形化分析、BI报表)
java·前端·spring boot·学习·echarts
Canmag 兴隆磁性13 小时前
自动磁场分布测试+镭雕设备 AT-C
学习·永磁材料·磁场分布测试