设置合理的字段类型和长度
我们在设计表的时候,要给相关字段设置合理的字段类型和长度。
如果字段类型和长度不够,有些数据可能会保存失败。
如果字段类型和长度太大了,又会浪费存储空间。
我们在工作中,要根据实际情况而定。
以下原则可以参考一下:
- 尽可能选择占用存储空间小的字段类型,在满足正常业务需求的情况下,从小到大,往上选。
- 如果字符串长度固定,或者差别不大,可以选择char类型。如果字符串长度差别较大,可以选择varchar类型。
- 是否字段,可以选择bit类型。
- 枚举字段,可以选择tinyint类型。
- 主键字段,可以选择bigint类型。
- 金额字段,可以选择decimal类型。
- 时间字段,可以选择timestamp或datetime类型。
异步思想很重要
不知道你有没有做过接口的性能优化,其中有一个非常重要的优化手段是:异步。
如果我们的某个保存数据的API接口中的业务逻辑非常复杂,经常出现超时问题。
现在让你优化该怎么优化呢?
先从索引,sql语句优化。
这些优化之后,效果不太明显。
这时该怎么办呢?
这就可以使用异步思想来优化了。
如果该接口的实时性要求不高,我们可以用一张表保存用户数据,然后使用job或者mq,这种异步的方式,读取该表的数据,做业务逻辑处理。
如果该接口对实效性要求有点高,我们可以梳理一下接口的业务逻辑,看看哪些是核心逻辑,哪些是非核心逻辑。
对于核心逻辑,可以在接口中同步执行。
对于非核心逻辑,可以使用job或者mq这种异步的方式处理。
事件发布订阅和多线程异步、注解异步的区别
事件发布订阅适合:
- ✅ 业务逻辑解耦
- ✅ 一个动作触发多个后续处理
- ✅ 需要支持动态增减处理器
- ✅ 需要精确的事务边界控制
多线程异步适合:
- ✅ 需要精确控制线程行为
- ✅ 复杂的并发逻辑
- ✅ 需要获取异步结果并进行后续处理
- ✅ 高性能要求的并发场景
注解异步适合:
- ✅ 简单的异步方法调用
- ✅ 不需要获取返回值的场景
- ✅ 快速实现方法异步化
- ✅ Spring环境下的简单异步需求
3. 详细对比表
特性 | 事件发布订阅 | 多线程异步 | 注解异步(@Async) |
---|---|---|---|
主要目的 | 解耦 + 一对多通信 | 并发执行 | 简化异步调用 |
执行方式 | 默认同步,可配异步 | 明确异步 | Spring管理异步 |
线程管理 | Spring管理 | 手动管理 | Spring管理 |
返回值 | void(通常) | Future/CompletableFuture | CompletableFuture |
事务传播 | 支持事务监听器 | 需手动处理 | 新事务或无事务 |
错误处理 | 每个监听器独立 | 需手动处理 | 需配置异常处理器 |
调用关系 | 一对多 | 一对一 | 一对一 |
配置复杂度 | 简单 | 复杂 | 简单 |
发布订阅和消息队列的区别
对比表格
特性 | Spring事件 | 消息队列(如RabbitMQ) |
---|---|---|
作用域 | 单个JVM内部 | 跨进程/跨服务 |
持久化 | 无 | 支持 |
可靠性 | 低(内存中) | 高(持久化+确认机制) |
性能 | 很高 | 较高(有网络开销) |
复杂度 | 简单 | 复杂 |
事务支持 | 与Spring事务集成 | 独立的事务机制 |
扩展性 | 单机 | 集群/分布式 |
监控 | 简单 | 丰富的监控工具 |