Hello Halo
如果你看到了这一篇文章,那么证明你已经安装成功了,感谢使用 Halo 进行创作,希望能够使用愉快。
状态机
什么是状态机 需求说明 在订单模块中订单共设计了7种状态,如下图 订单会在多个状态间进行转换,这就需要开发人员都去记忆这些转换关系,这是非常麻烦的 if(订单状态 == 待支付){ //如果用户支付成功,执行此场景下的业务逻辑,更新订单状态为派单中 update(id,派单中) ) if(
数据表设计规范
设计范式 数据库设计三范式: 第一范式:数据表中的每一列都是原子的,不可再拆分 第二范式:每张表中的一条记录只描述一个实体 第三范式:数据表中不要存在冗余字段(可以通过其他字段推导出的字段) 1)第一范式:数据表中的每一列都是原子的,不可再拆分 有一张用户考勤表设计如下 id 用户名 考勤时间 1
缓存优化
针对系统中访问频率很高的页面,常见的优化方案如下: 将页面做页面静态化处理 如果静态化之后依旧无法满足需求,可以将静态资源转移到CDN服务器 页面上变动的内容可以异步请求后端服务器获取数据,后端可以添加缓存来减轻数据库的压力 数据库方面可以通过合理的存储引擎选择、表字段设计、索引设计等进一步提高查询
事务失效
事务失效问题 如果只对其中的一段代码添加事务,比方只对其中的**this.save(orders);**一行添加事务 想实现的话有两种方案: 使用Spring的编程式事务,这种方式控制粒度更精准,但是缺点是代码耦合度高,需要自己写代码处理事务 将需要控制事务的那段代码单独提到一个方法中去,然后仅仅对
冷热分离
需求分析 随着时间的推移,订单数据会逐渐增加,而在这些数据中,超过15天的订单是无法再进行变化的 因此一笔订单在15日之后的访问频率就会大大降低,为了提高订单表的查询效率,可以它转移到单独的库中 也就是将订单数据分到两个库中进行存储 订单库:存储15日之内的订单(数据量较小,访问频率高,属于热数据)
订单重复提交问题
订单重复提交 订单重复提交指的是同一个订单多次提交的情况,常见原因如下: 重复点击:用户可能会因为网络延迟、手抖、页面加载缓慢等原因,多次点击下单提交按钮 页面刷新:用户在订单提交后,如果刷新页面,浏览器可能会重新发送上一次的表单提交请求 防止订单重复提交的本质就是保证下单方法不要被重复调用,这首先
分库分表
随着用户不断的进行下单,MySQL订单表中的数据会不断的增多,其存储及查询性能也会随之下降 当数据量没有那么大的时候,可以通过添加索引和缓存来进行查询优化,但是数据量过大,就只能分库分表了 分库分表可以简单理解为原来一个表存储数据现在改为通过多个数据库及多个表去存储 一般认为,当MySQL单表行数超
超卖方案(线程锁)
超卖方案 Java锁 jvm提供了很多锁,它们都可以解决线程安全问题,大致可以分为两类:悲观锁和乐观锁 悲观锁 悲观锁认为当前线程在操作共享资源期间,总会有其它线程修改数据 为了保证线程安全,就要在操作前总是先加锁,操作完成后释放锁 像Java中的synchronized、ReentrantLock
责任链模式
基本理论 责任链模式允许请求沿着处理链进行传递,链中的每个处理者都要决定是自己处理,还是交给下一环处理 在这里有一个很经典的案例就是请假审批,比如我们有这样一个需求,就是当员工请假时,审批规则如下: 请假天数少于3天,组长审批 请假天数在3-5天,主管审批 请求天数大于5天,经理审批 此时就可以使用