当前位置: 首页 > java >正文

Web应用开发 --- Tips

Web应用开发 --- Tips

  • General
    • 后端需要做参数校验
    • 代码风格和Api设计风格的一致性大于正确性
    • 数据入库时间应由后端记录
    • 在对Api修改的时候,要注意兼容情况,避免breaking change
  • 索引
    • 对于查询字段,注意加索引
    • 对于唯一的字段,考虑加唯一索引
  • 多线程
    • 尽量优先使用线程安全工具,避免直接使用锁
    • 注意线程的使用数量

General

后端需要做参数校验

  • 后端Api需要根据情况,进行参数校验

代码风格和Api设计风格的一致性大于正确性

  • 一致的代码风格使团队所有成员都能快速理解代码
    新成员加入时学习曲线更低
    减少"这是谁写的代码?"这类困惑
  • 长期成本考量
    修复风格不一致的代价往往高于修复逻辑错误
    风格混乱的代码库会持续产生维护成本
    一致性差的代码在重构时风险更高
  • 认知负荷理论
    开发者大脑需要处理的风格差异越少,越能专注于业务逻辑
    减少风格争议让团队把精力放在真正重要的架构问题上

数据入库时间应由后端记录

  • 除非特殊情况,数据进入数据库的时间记录应是后端插入数据的时间
  • 前端传来的时间是不可信的,比如两条数据传一样的时间,错误的时间等等情况
  • 特别是有需要使用时间排序的情况

在对Api修改的时候,要注意兼容情况,避免breaking change

  • 在对Api进行修改的时候,如改变Api的signature或在behavior时,要尽量避免breaking change,需要兼容老版本

索引

对于查询字段,注意加索引

  • 对于查询的字段,需要考虑加索引提高查询速度

对于唯一的字段,考虑加唯一索引

  • 对于不可重复的字段,需要加唯一索引

多线程

尽量优先使用线程安全工具,避免直接使用锁

  • 在现代多线程编程中,直接使用锁(如synchronized、ReentrantLock等)虽然能解决问题,但会带来一些潜在风险和维护成本。更好的做法是优先使用线程安全的集合和其他封装好的并发工具
  • C#并发安全的集合
ConcurrentDictionary<TKey, TValue> 
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>
BlockingCollection<T>
  • c# 原子操作 (System.Threading.Interlocked)
Interlocked.Increment(ref counter); // 原子递增
Interlocked.Decrement(ref counter); // 原子递减
Interlocked.Exchange(ref value, newValue); // 原子交换
Interlocked.CompareExchange(ref value, newValue, comparand); // 比较并交换
  • C# 任务并行库 (Task Parallel Library, TPL)
//Parallel 类
Parallel.For(0, 100, i => {// 并行执行的代码
});
Parallel.ForEach(collection, item => {// 并行处理的代码
});
 //PLINQ (Parallel LINQ)
var results = data.AsParallel().Where(x => x > 0).Select(x => Process(x)).ToList();
//Task 类
Task.Run(() => {// 后台执行的代码
});var task1 = Task.Run(() => DoWork1());
var task2 = Task.Run(() => DoWork2());
Task.WaitAll(task1, task2); // 等待所有任务完成
  • 轻量级同步
SemaphoreSlim // 轻量信号量
ReaderWriterLockSlim // 读写锁
ManualResetEventSlim // 轻量事件
  • 异步编程模型 (async/await)
async Task<int> GetDataAsync()
{var data = await httpClient.GetStringAsync(url);return ProcessData(data);
}

注意线程的使用数量

  • 在使用多线程的时候,需要预估和注意线程的数量. 过多的线程数量会导致资源紧张问题
  • 比如一个发送消息的代码, 当taskNum过于大的时候,会导致大量的线程被创建,消耗资源
    解决方案
  • 思考是否真的需要多线程,可否不用
  • 使用信号量控制线程数量
  • 使用线程池控制线程数量
    public void Run(int taskNum){var producerTasks = new Task[taskNum];for (int i = 0; i < producerTasks.Length; i++){int producerId = i + 1;producerTasks[i] = Task.Run(() => ProducerThread(producerId));}}
http://www.xdnf.cn/news/14716.html

相关文章:

  • Windows 环境下设置 RabbitMQ 的 consumer_timeout 参数
  • 现代 JavaScript (ES6+) 入门到实战(三):字符串与对象的魔法升级—模板字符串/结构赋值/展开运算符
  • 华为云Flexus+DeepSeek征文 | 二次开发学习顾问系统对接华为云ModelArts Studio 实现智能答疑学习辅导
  • 设计模式之适配器模式
  • Unity Catalog 三大升级:Data+AI 时代的统一治理再进化
  • Leetcode 3598. Longest Common Prefix Between Adjacent Strings After Removals
  • JDK自带的HttpClient,替代Apache的更优解?
  • Spring Cloud:分布式事务管理与数据一致性解决方案
  • 【如何实现分布式压测中间件】
  • 【算法设计与分析】(二)什么是递归,以及分治法的基本思想
  • 【word】把参考文献序号统一换为上标
  • github上传代码步骤(http)
  • Redis--黑马点评--消息队列
  • 基于 SpringBoot 实现一个 JAVA 代理 HTTP / WS
  • 电压跟随器输入电压正常、输出电压等于0V?
  • WebRTC(十三):信令服务器
  • python动漫周边电商网站系统
  • 视频序列中的帧间匹配技术 FrameMatcher 详解
  • 领域驱动设计(DDD)【23】之泛化:从概念到实践
  • SQL 子查询全位置解析:可编写子查询的 7 大子句
  • Web基础关键_004_CSS(二)
  • 2023国赛linux的应急响应-wp
  • JSON简介及其应用
  • 【LLIE专题】EnlightenGAN 无监督低照度图像增强
  • 实现一个AI大模型当前都无法正确实现的基础二叉树读取算法
  • 商业秘密中经营信息的法律保护探析——以客户名册为例
  • 数字孪生技术引领UI前端设计新革命:实时交互与模拟预测
  • 【Bluedroid】蓝牙启动之BTM_reset_complete源码解析
  • yolov13+bytetrack的目标跟踪实现
  • pytorch中的几个概念