仿牛客网社区项目总结 第三章

学习仿牛客网社区项目

代码&资源

各章节总结
第一章
第二章
第三章
第四章
第五章
第六章
第七章
第八章

文章目录

    • 过滤敏感词
      • Java原生API的缺点?
      • 过滤敏感词的基本原理?
    • 异步请求
      • 什么是异步请求?
      • 什么是AJAX?
    • 事务管理
      • 什么是事务?
      • 常见的并发异常有哪些?
      • 常见的隔离级别有哪些?
      • 事务的实现机制有哪些?
    • 统一捕获异常
      • 怎样实现统一捕获异常?
    • 统一记录日志
      • 怎样实现统一记录日志?
      • 什么是AOP?
      • AOP的常用术语有哪些?
      • 什么是SpringAOP?

过滤敏感词

Java原生API的缺点?

Java自带的原生API也可以实现过滤敏感词,但若遇到大篇幅文章,replace方法性能就太低了。
故使用前缀树方法,此方法用空间换时间,以消耗内存为代价。

过滤敏感词的基本原理?

  1. 用到三个指针,第一个指针指向树的结点,根节点为空。如下图:
    仿牛客网社区项目总结 第三章_第1张图片
  2. 用两个指针遍历字符串,上面的为begin,下面的为position。begin先移动,同时树指针检查root的子节点,若二者匹配则树指针指向子节点position++;若二者没有匹配则begin++position++。直到position遍历完整个字符串(相比begin遍历完整个字符串更节约性能一点)。最终begin~position即为敏感词,用“**”替换。

特点:begin只进不退,position以当前begin为起点,来回跳动。

仿牛客网社区项目总结 第三章_第2张图片
3. StringBuilder是一个类,用来拼接字符串,这里我们用作存储结果字符串。
在这里插入图片描述

异步请求

什么是异步请求?

整个网页不刷新,访问服务器,得到数据后返回给网页,局部刷新。实现异步请求的技术叫AJAX。网页能够将增量更新呈现在页面上。

什么是AJAX?

AJAX指异步的json和xml技术,不是一门新的语言,而是使用现有技术的新方法。项目中帖子发布成功/失败的提示使用该技术。

事务管理

什么是事务?

事务是由N步数据库操作序列组成的逻辑执行单元,这一系列操作要么全执行,要么全放弃执行。即一旦开始,必须全部执行完。

常见的并发异常有哪些?

详细解释
第一类丢失更新:某一个事务回滚,会导致另一个事务已更新的数据丢失。
第二类丢失更新:某一个事务提交,会导致另一个事务已更新的数据丢失。
脏读:某一个事务读取了另一个事务未提交的数据。
不可重复读:某一个事务对同一个数据前后读取的结果不一致。
幻读:某一个事务对同一个表前后查询的行数不一致。

常见的隔离级别有哪些?

Serializable:串行化。
Repeatable Read:可重复读。
Read Committed:读取已提交的数据。
Read Uncommitted:读取未提交的数据。
仿牛客网社区项目总结 第三章_第3张图片

事务的实现机制有哪些?

  1. 悲观锁(数据库)

    • 共享锁(S锁):事务A对某数据加了共享锁,其他事务只能加共享锁,不能加排他锁。(只读不写)
    • 排他锁(X锁):事务A对某数据加了排他锁,其他事务不能加共享锁,也不能加排他锁。(不读不写)
  2. 乐观锁(自定义)

    更新前检查版本号/时间戳,若未变化则更新,否则取消本次更新。

统一捕获异常

怎样实现统一捕获异常?

服务器的三层结构中,错误会层层向上传递,所以只需要在表现层(controller)统一处理错误即可。
在SpringBoot的项目某一路径下,加上对应的错误页面,发生错误时会自动跳转。

统一记录日志

怎样实现统一记录日志?

使用AOP技术(面向切面编程)。

什么是AOP?

面向切面编程,是一种编程思想,是对OOP(面向对象编程)的补充。将业务模块共同调用的逻辑封装起来,降低耦合,可以进一步提高编程效率。如下图:右上角为系统组件,这些组件横跨了多个业务组件,像切开它们一样(面向切面)。
仿牛客网社区项目总结 第三章_第4张图片

AOP的常用术语有哪些?

我们只需要编写Aspect封装组件的代码,通过Weaving(织入)到目标代码的连接点(Jionpoint)进行控制。
切点(Pointcut)控制织入的具体位置;
通知(Advice)控制织入的具体逻辑。
仿牛客网社区项目总结 第三章_第5张图片

什么是SpringAOP?

SpringAOP本质上基于动态代理,当要代理的对象实现了某接口,会使用JDK动态代理,在运行时通过创建接口的代理实例,织入代码。当要代理的对象没有实现接口,则使用Cglib技术(编译时增强),通过子类代理织入代码。

参考文章

你可能感兴趣的:(项目,#,仿牛客网社区项目,java,spring,spring,boot)