汇总

second

关系型数据库&非关系型数据库

Pasted image 20260903154044

docker是什么? 其原理是?

基于 Linux 内核特性的容器引擎。把应用和依赖打包成镜像,跑起来是进程级隔离的容器,不带独立内核。

三根支柱

  • Namespace 管隔离:PID / Network / Mount / UTS / IPC / User,让容器以为自己独占一台机器
  • Cgroups 管限制:CPU、内存、IO 配额,防止单个容器吃满宿主
  • UnionFS 管镜像分层:镜像是只读层叠加,容器启动时在顶上加一个可写层,写时复制,所以层可共享、启动秒级

三个概念

  • 镜像:模板,Dockerfile 每条指令生成一层
  • 容器:镜像的运行实例
  • 仓库:存镜像,Docker Hub / Harbor

和虚拟机的区别

  • VM 虚拟化硬件,每台带完整 OS 和内核,启动分钟级、GB 量级
  • 容器共享宿主内核,启动秒级、MB 量级,代价是隔离性弱一些,且不能跨内核(Docker Desktop 底下其实跑着一个 Linux 虚拟机)

常用:Dockerfile 构建、compose 编排多容器、volume 做持久化、bridge 网络让容器互通,集群调度交给 K8s。

agent是什么? 其原理是?

以 LLM 为决策核心、能调用外部工具、在循环里自主完成多步任务的程序。相比单轮问答,它有状态、能行动、能根据执行结果修正下一步。

核心是一个循环(ReAct)

  1. 系统提示 + 工具定义 + 历史消息一起发给模型
  2. 模型输出下一步:直接回答,或返回 tool_call(工具名 + JSON 参数)
  3. 外层程序真正执行这个工具,读文件、查库、调 API、跑命令
  4. 执行结果作为新消息追加回上下文
  5. 回到第 1 步,直到模型不再要工具或触发步数上限

模型本身不执行任何东西,它只输出”我想调什么”,执行权在外层 harness 手里。

四个组成

  • 规划:拆解目标,复杂任务用 CoT、反思、子 agent
  • 工具:用 JSON Schema 描述函数签名,模型按 schema 填参
  • 记忆:短期靠上下文窗口,长期靠向量检索或落盘文件
  • 反馈:结果和报错回灌上下文,形成闭环

工程上的坑:上下文窗口有限,长任务要压缩历史;工具要幂等且做权限白名单;必须设最大步数防死循环;模型填的参数要校验再执行。

给你一个项目, 如何在这个项目的基础上添加新的功能? (实际操作)

六步:跑起来、读范式、设计、通链路、自测、提交。

1 先跑起来,别急着写代码

  • README 和 pom.xml 摸清技术栈、依赖了哪些中间件(MySQL、Redis、MQ、注册中心)
  • 本地完整启动一次,确认基线是干净的,后面出问题才能确定是自己引入的
  • 顺手跑一遍已有测试

2 摸清项目的既有范式(最关键)

  • 从启动类进去看分层:controller / service / mapper / entity / config
  • 挑一个和新功能最像的现有功能,从接口入口一路读到 SQL
  • 重点记四件事:统一响应体、全局异常怎么抛、参数校验怎么做、日志怎么打

目的是让新写的代码看起来像原作者写的,而非塞进个人风格。

3 设计

  • 先查现成实现:官方文档定接口语义,同类开源项目看数据模型和踩坑,通用能力直接引依赖
  • 需求边界:输入输出、异常场景、并发量级
  • 数据层:新建表还是老表加字段,索引怎么建,历史数据要不要刷
  • 接口层:URL、请求响应结构、错误码复用项目现有体系
  • 影响面:会动到哪些老逻辑,要不要加开关兜底

4 拉分支,先打通最小闭环

  • git checkout -b feature/xxx,不在 main 上直接写
  • Controller 先返回假数据,Postman 打通,确认路由、拦截器、鉴权这条链路是活的
  • 链路通了再从下往上填逻辑:Entity → Mapper → Service → Controller
  • 先通链路再填逻辑,能把框架配置问题和业务逻辑问题隔离开,debug 快很多

5 自测三件套

  • 单测:Service 层用 Mockito mock 掉 Mapper,测核心分支
  • 接口:正常、异常、边界值(空值、超长、重复提交)各打一遍
  • 回归:相关的老接口再跑一遍,确认没改坏

6 提交

  • commit 按项目规范,例如 feat: 新增文章点赞功能
  • MR 写清三句话:改了什么、为什么这么改、怎么测的
  • Review 过了再合

实例:给博客加文章点赞。先读收藏功能的完整实现,跟着它的 Result<T>@Valid 写;点赞表用 (user_id, article_id) 联合唯一索引防重复;计数走 Redis INCR 扛高频写,定时任务异步刷回 MySQL。

三个易踩的坑:改了 MySQL 忘删 Redis 留下脏数据;@Transactional 里套远程调用把事务占死;漏唯一索引或分布式锁导致重复提交写脏。

如何看待 Java和python

两门语言定位不同,谈不上谁替代谁。

  • 类型系统:Java 静态强类型,编译期就能抓错,重构有保障;Python 动态类型写得快,项目一大要靠 type hints 加 mypy 补
  • 运行方式:Java 编译成字节码跑在 JVM 上,JIT 把热点代码编成机器码,性能接近原生;Python 解释执行,有 GIL,多线程吃不满多核
  • 并发:Java 有线程池、JUC、虚拟线程,天生适合高并发服务端;Python 用 asyncio 扛 IO 密集,CPU 密集只能上多进程
  • 生态:Java 占企业级后端和大数据基建,Spring、Netty、Kafka、Flink;Python 占 AI 和数据科学,PyTorch、NumPy、pandas
  • 工程性:Java 啰嗦但约束强,适合多人长期维护;Python 简洁自由,适合快速验证和脚本