学习仿牛客网社区项目
各章节总结 |
---|
第一章 |
第二章 |
第三章 |
第四章 |
第五章 |
第六章 |
第七章 |
第八章 |
文章目录
过滤敏感词
Java原生API的缺点?
Java自带的原生API也可以实现过滤敏感词,但若遇到大篇幅文章,replace方法性能就太低了。
故使用前缀树方法,此方法用空间换时间,以消耗内存为代价。
过滤敏感词的基本原理?
- 用到三个指针,第一个指针指向树的结点,根节点为空。如下图:
- 用两个指针遍历字符串,上面的为begin,下面的为position。begin先移动,同时树指针检查root的子节点,若二者匹配则树指针指向子节点position++;若二者没有匹配则begin++position++。直到position遍历完整个字符串(相比begin遍历完整个字符串更节约性能一点)。最终begin~position即为敏感词,用“**”替换。
特点:begin只进不退,position以当前begin为起点,来回跳动。
3. StringBuilder是一个类,用来拼接字符串,这里我们用作存储结果字符串。
异步请求
什么是异步请求?
整个网页不刷新,访问服务器,得到数据后返回给网页,局部刷新。实现异步请求的技术叫AJAX。网页能够将增量更新呈现在页面上。
什么是AJAX?
AJAX指异步的json和xml技术,不是一门新的语言,而是使用现有技术的新方法。项目中帖子发布成功/失败的提示使用该技术。
事务管理
什么是事务?
事务是由N步数据库操作序列组成的逻辑执行单元,这一系列操作要么全执行,要么全放弃执行。即一旦开始,必须全部执行完。
常见的并发异常有哪些?
- 第一类丢失更新:某一个事务回滚,会导致另一个事务已更新的数据丢失。
- 第二类丢失更新:某一个事务提交,会导致另一个事务已更新的数据丢失。
- 脏读:某一个事务读取了另一个事务未提交的数据。
- 不可重复读:某一个事务对同一个数据前后读取的结果不一致。
- 幻读:某一个事务对同一个表前后查询的行数不一致。
常见的隔离级别有哪些?
- Read Uncommitted:读取未提交的数据。
- Read Committed:读取已提交的数据。
- Repeatable Read:可重复读。
- Serializable:串行化。
事务的实现机制有哪些?
-
悲观锁(数据库)
- 共享锁(S锁):事务A对某数据加了共享锁,其他事务只能加共享锁,不能加排他锁。(只读不写)
- 排他锁(X锁):事务A对某数据加了排他锁,其他事务不能加共享锁,也不能加排他锁。(不读不写)
-
乐观锁(自定义)
更新前检查版本号/时间戳,若未变化则更新,否则取消本次更新。
统一捕获异常
怎样实现统一捕获异常?
服务器的三层结构中,错误会层层向上传递,所以只需要在表现层(controller)统一处理错误即可。
在Spring Boot的项目某一路径下,加上对应的错误页面,发生错误时会自动跳转。
AOP
什么是AOP?
面向切面编程,是一种编程思想,是对OOP(面向对象编程)的补充。将业务模块共同调用的逻辑封装起来,降低耦合,可以进一步提高编程效率。如下图:右上角为系统组件,这些组件横跨了多个业务组件,像切开它们一样(面向切面)。
AOP的常用术语有哪些?
我们只需要编写Aspect封装组件的代码,通过Weaving(织入)到目标代码的连接点(Jionpoint)进行控制。
切点(Pointcut)控制织入的具体位置;
通知(Advice)控制织入的具体逻辑。
什么是Spring AOP?
Spring AOP本质上基于动态代理,当要代理的对象实现了某接口,会使用JDK动态代理,在运行时通过创建接口的代理实例,织入代码。当要代理的对象没有实现接口,则使用Cglib技术(编译时增强),通过子类代理织入代码。
怎样实现统一记录日志?
本项目中,将aspect织入所有业务模块,通过这段代码,实现统一记录日志。