什么是Spring框架?

有很多模块组成,利用这些模块可以方便开发工作。这些模块是:核心容器(spring core)/数据访问和集成(Spring JDBC)/Web(Spring Web/MVC)/AOP(Spring Aop)/消息模块/测试模块(Spring Test)等。

对Spring IoC的理解

IoC的意思是控制反转,是一种设计思想,把需要在程序中手动创建对象的控制权交给了Spring框架。IoC的载体是IoC容器,本质是一个工厂,数据结构上来看是一个Map,用来存放着各种对象。当我们创建一个对象时,只需要配置好配置文件/注解,而不用担心对象是怎么被创建出来的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qNG5V40t-1606197541408)(en-resource://database/5616:1)]
IoC的优点:降低耦合,对象被容器管理需要两份数据:你的对象定义 + 配置文件,对象间的关系体现在配置文件,不会直接产生耦合。

什么是DAO

data access object,存放数据库访问对象。

Spring中关于Bean的注解

四种常见Bean
@Controller @Repository @Service @Component一般来说Bean只会被容器初始化一次,@PostConstruct:初始化前调用 @PreDestroy:销毁之前
如何使用Bean
bean通过容器管理,不需要我们实例化,如果要使用某个bean,使用依赖注入 @Autowired

Spring MVC是什么,是怎样的工作流程

服务器分为表现层/业务层/数据层,其中Spring MVC是工作在表现层,作用是接收/解析用户发送的请求,调用对应的业务类,根据业务类返回的结果(ModelAndView),调用view进行视图渲染,并将渲染后的View返回给请求者。具体分为以下8步。

  1. 客户端(浏览器)发送请求给前端处理器(DispatcherServlet)(发送请求,响应结果)
  2. DispatcherServlet根据请求信息调用HandlerMapping,查找到对应的Handler。
  3. 查找到对应的Handler(也就是Controller)后,由HandlerAdapter适配器处理
  4. HandlerAdapter根据Handler来调用真正的Controller
  5. Controller进行业务处理,返回ModelAndView对象,Model是数据对象,View是逻辑上的View
  6. ViewResolver根据逻辑view找到实际view
  7. DispatcherServlet把Model传给view进行视图渲染,然后返回给请求者
  • C - Controller:控制器。接受用户请求,调用 Model 处理,然后选择合适的View给客户。
  • M - Model:模型。业务处理模型,接受Controller的调遣,处理业务,处理数据。
  • V - View:视图。返回给客户看的结果。

什么是SSM框架?

包括Spring + Spring MVC(和Spring天生集成) + MyBatis(帮你你和数据库打交道的框架,简单的设置,你就可以像Java一样,操作数据库了)

怎么实现注册功能的?

根据请求来拆解功能
1,打开注册网页
2,把注册的信息发送给服务器(点注册)
3,把激活邮件发送给邮箱
4,利用激活链接打开网页

每一次请求都是先开发数据访问层,在开发业务层,最后开发视图层(三层架构),但是每一次请求不一定要用到这三层

什么是Interceptor,在项目的哪里使用到了Interceptor?

Interceptor是SpringMVC的处理器(handler)拦截器,用于对处理器进行预处理和后处理。本项目中,每次请求都会检查request中的login_ticket,把找到的user信息存放在协程中,并在完成处理后,自动释放。(方便的进行用户信息取用)

使用什么技术生成验证码

使用Kaptcha包,可随机生成字符和图片。

如何检查登陆状态

加拦截器注解。

如何实现敏感词过滤

使用前缀树(字典树)存储敏感词,对text中的敏感词实现替换。

什么是Ajax,应用在项目哪些地方?

ajax指异步的json和xml技术,不是一门新的语言,而是使用现有技术的新方法。最大的特点是:不重新加载整个页面的基础上,可以与服务器交换数据,并更新部分网页数据。
项目中:帖子发布成功/失败的提示,使用到ajax

什么是事务,事务的四大特性。

定义:事务是逻辑上的一组操作,要么都执行,要么都不执行。
ACID:
A:原子性,事务是最小的执行单位,不允许被分割,事务的全部操作要么全部提交成功,要么全部失败回滚。
C:一致性,数据库在事务执行前后保持一致性状态,在一致性状态下,所有事务对同一个数据的读取结果相同。
I :隔离性,一个事务所作的修改在最终提交前,对其他事务是不可见的。
D(Duability):持久性,一旦事务提交,所做的修改将被永远保存到数据库中。即使系统发生崩溃,事务执行的结构也不能丢失。

在并发环境下,并发事务会出现哪些问题?

  • 脏读:事务A读到了事务B修改但未提交的数据。
  • 丢失修改:事务A和事务B同时读取了某一数据,并进行减1,此数据最终只会减一。
  • 不可重复读:事务A多次读取某数据时,发现前后不一致(被事务B修改了)
  • 幻读:和不可重复读类似,事务A读取到几行数据,事务B此时插入数据,随后的查询中,事务A发现了一些原本不存在的数据。(不是读取)

介绍SQL的四个隔离级别

  • READ-UNCOMMITED(读取未提交):会出现脏读,不可重复读,幻读。
  • READ-COMMITED:会出现不可重复读,幻读
  • REPETABLE-READ:会出现幻读
  • SERIALIZABLE:都不会出现

怎么利用Spring实现事务管理

Spring管理事务忽略了底层数据库的结构,非常方便。有两种方式:注解(类型,传播方式)/编程式事务(override)。

是怎样实现统一捕获异常的?

在SpringBoot的项目某一路径下,加上对应的错误页面,发生错误时自动会跳转。服务器的三层结构中,错误会层层向上传递,所以只需要在表现层(controller)统一处理错误即可。
方法:在controller中加上advice包,并通过注解@ControllerAdvice和@ExceptionHandler,统一捕获异常。

是怎样实现统一记录日志的?

使用了AOP技术(面向切面编程),这里使用到的是SpringAOP。 AOP技术能够将哪些与业务,但是为业务模块共同调用的逻辑或责任(比如事务处理,日志记录,权限控制等),封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的扩展性和维护性。 SpringAOP本质上基于动态代理,当要代理的对象实现了某接口,会使用JDK动态代理,在运行时通过创建接口的代理实例,织入代码。当要代理的对象没有实现接口,则使用Cglib技术(编译时增强),通过子类代理织入代码。

什么是Redis,Redis有哪些优点?

概念:redis是一个非关系型数据库,数据存储在内存中,读写速度快。可以存储键和五种不同类型值的映射。只能以字符串为键,值支持:字符串,列表,无序集合,有序集合,hash散列表。
优点:由于数据存储在内存中,读写速度非常快,满足高性能,高并发的系统要求。与Java原生的map/guava相比,支持分布式缓存。与memcached相比,支持更丰富的数据类型,且支持数据持久化。

Redis分布式集群架构

典型的分片+复制

怎么往Spring框架中配置redis,介绍常见的redis操作

如何配置
1,导入jar包
2,配置端口,以及配置类redisTemplate(注入连接工厂/设置序列化方式(json))
常见操作
Value类型:redisTemplate.opsForValue().set(redisKey, 1),redisTemplate.opsForValue().get(redisKey), redisTemplate.opsForValue().increment(redisKey),
Hash类型:redisTemplate.opsForHash().put(redisKey, “id”, 1), 还有get等操作
List类型:redisTemplate.opsForList().leftPush(redisKey, 101), 还有size, index, range, leftPop等操作
Set类型:add, size, pop, members等操作
Zset类型:redisTemplate.opsForZSet().add(redisKey, “Linda”, 92), 有socre,rank,reverseRank, range等操作
操作key:可以delete,以及设置过期时间
同时支持绑定操作,支持事务(编程式事务,在事务中一般不包含查询)
为什么不包含查询:redis事务就是一系列命令的批量操作,批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。

怎样存储的点赞/关注/缓存用户数据

点赞使用set类型存储,key为点赞对象,set中保存点赞人的ID
关注使用zSet类型存储,key为被关注者,set保存关注者以及关注时间为score
缓存用户数据使用Value类型,key为用userID得到的key,value为user对象(设置过期时间,且数据修改时需要清除缓存)

什么是消息队列

消息队列是一个存放消息的容器,生产者把消息放在队列中,消费者从消息队列中取出数据。消息队列的主要功能(优点)在于:
1,解耦:生产者只负责把消息放在队列中,而不用关心谁去使用它。
2,异步:生产者把消息放在队列中后即可返回,而不用一个个的通知消费者去执行,消费者是异步的获取消息的。
3,限流:生产者一次性产生大量的数据时,不会给消费者造成压力,消费者可以根据自身的能力,去消息队列中取数据。

消息队列作为信息传递的中间件,需要注意哪些问题?

1,高可用:因为消息队列如果宕机,会导致整个系统不可用。(分布式/集群的现成支持)
2,数据持久化:防止数据丢失
3,如何取数据:消息队列主动通知或者消费者轮询。

Java中的blockingqueue,可以提供线程间的消息队列

BQ也是生产者与消费者模式,属于点对点式消息队列?(一个消息只会被消费一次)Blocking Queue构建了一个桥梁,能够解决生产速度/消费速度不匹配问题。阻塞的时候只是在那里等着,但是不会占用CPU资源,对性能不会有影响。

什么是Kafka,有哪些功能和应用场景?

Kafka为分布式流处理平台。流处理是指对不断产生的动态数据流实时处理,基于分布式内存,具有数据处理快速,高效,低延迟的特性。
Kafka主要提供的功能包括:消息系统,日志收集,用户行为跟踪,流式数据处理。

Kafka的消息模型,以及常见术语

消息模型:发布-订阅模型,消费者订阅了某一主题(topic)后,生产者采用类似广播的方式,将消息通过主题传递给所有的订阅者。
Topic:主题,类似于文件夹,用来存放不同的数据。
Partition:主题分区,同一主题的不同分区可以存放在不同的Broker上面,保证并发能力和负载均衡。
Offset:消息在Partition中的存放位置。
Broker:可以理解为kafka集群里面的一台或多台服务器,它本身是没有复制的,上面可能运行着topic1的leader, topic2的follower等等。

在项目哪里用到了Kafka

当有点赞,评论,关注请求时,会发送系统通知点赞,评论,关注的对象。在处理系统信息时,使用到了Kafka,具体来说,先定义了生产者类和消费者类,其中生产者被点赞/评论/关注功能对应的Controller使用,产生消息。而消费者负责消息(message)到来时,把消息存到数据库内。

什么是ElasticSearch,存储原理,功能,特点

概念:ES是一个基于lucene构建的,分布式的,RESTful的开源全文搜索引擎。
存储原理:数据按照Index – Type – Document – 字段四级存储,其中Index对应数据库,Type对应表,Document为搜索的原子单位,包含一个或多个容器,基于JSON表示。字段是指JSON中的每一项组成,类似于数据库中的行/列。Mapping是文档分析过滤后的结果,根据用户自定义,将某些文字过滤掉,类似于表结构定义DDL??。同时ES也和分布式数据库一样,支持shard的replication
功能:
1,分布式的搜索引擎和数据分析引擎
2,全文检索,结构化检索,数据分析。
3,对海量数据进行近实时的处理
特点:
1,可以作为分布式集群处理PB级别的数据,也可单机使用。
2,不是特有技术,而是将分布式+全文搜索(lucene) + 数据分析合并在一起。
3,操作简单,作为传统数据库的补充,提供了数据库所不具备的很多功能。

项目中哪里使用到了ES,如何使用

在进行帖子搜索时,使用到了ES。可用Repository和Template两种方式,由于Repository搜索到的结果(直接返回的post类,方便)没有高亮标签(why),所以使用了template方式重写了mapResults函数,获得了带有高亮标签的post。
使用消息队列(kafka)的方式,实现发帖/删帖后ES数据库的自动更新。
搜索:定义SearchQuery,确定搜素内容,排序方式,高亮等。接着使用elasticTemplate.queryForPage方法,需要重写mapResults函数,得到高亮数据。

项目中使用到了SpringSecurity在哪些地方?

重构了用户权限控制(之前用的拦截器)

怎样统计网站UA和DAU

使用Redis的高级数据结构:
HyperLogLog:超级日志,统计独立整数个数。统计UA(独立访问)时,以日期为rediskey,将客户端ip add到HyperLogLog中(redisTemplate.opsForHyperLogLog().add(redisKey, i);)
Bitmap:位图,比如365天的签到,只需要365/8个字节的大小。统计DAU(日活跃用户)时,以日期为redis key,以用户ID作为位(在数据中的位置),用or操作,既可以方便的统计一段时间内的注册用户访问人数。

什么是Quartz,特点,专业术语,项目应用

概念:quartz是一个开源项目,完全基于java实现。是一个优秀的开源调度框架。
特点:
1,强大的调度功能,例如支持丰富多样的调度方法
2,灵活的应用方式,例如支持任务和调度的多种组合方式
3,分布式和集群能力
专业术语:
scheduler:任务调度器 , scheduler是一个计划调度器容器,容器里面有众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行
trigger:触发器,用于定义任务调度时间规则
job:任务,即被调度的任务, 主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job
misfire:本来应该被执行但实际没有被执行的任务调度
项目应用:定时的统计帖子分数(如何设置定时任务和trigger)

什么是Caffeine,如何缓存,项目应用

概念:Caffeine 是一个基于Java 8的高性能本地缓存框架
初始化cache:缓存保存的对象,使用Caffeine.newBuilder()创建,创建时设置缓存大小,过期时间,缓存未命中时的加载方式。
为什么只缓存热度帖子?不会经常变。

牛客网项目(社区项目)知识整理相关推荐

  1. 从零开始—仿牛客网讨论社区项目(六)

    主要技术架构: SpringBoot Spring SpringMVC MyBatis Redis Kakfa Elasticsearch Spring Security Spring Actator ...

  2. 从零开始—仿牛客网讨论社区项目(一)

    主要技术架构: SpringBoot Spring SpringMVC MyBatis Redis Kakfa Elasticsearch Spring Security Spring Actator ...

  3. 仿牛客网讨论社区项目—优化网站性能

    性能优化: 1.考虑加入缓存优化 优化热门帖子列表 GitHub中搜索caffeine 在Maven Repository搜索caffeine配置文件,在resources文件包内的pom.xml文件 ...

  4. 【牛客网C++服务器项目学习】-Day09-网络模型个人总结

    项目学习地址:[牛客网C++服务器项目学习] day09 项目学习进入了第四章--网络编程.这一章的学习,前半段是对计算机网络体系进行一个大致的讲解.我自己在今年4月份系统性的看了<计算机网络自 ...

  5. 【牛客网C++服务器项目学习】Day6-有名管道、内存映射、信号机制

    项目学习地址:[牛客网C++服务器项目学习] 有名管道: 有名管道特点: 有名管道是FIFO文件,存在于文件系统中,可以通过文件路径名来指出. 管道文件仅仅是文件系统中的标示,并不在磁盘上占据空间.在 ...

  6. 【牛客网C++服务器项目学习】Day8-线程相关、线程锁、条件变量、信号量

    项目学习地址:[牛客网C++服务器项目学习] day08 函数:void pthread_exit(void *retval); 功能:终止调用这个函数的线程.如果是一个进程的最后一个线程调用该函数, ...

  7. 框架复习笔记-Java-案例:牛客网讨论社区

    文章目录 搭建开发环境 Spring入门 Spring IoC实例分析 Spring MVC入门 请求 响应 Mybatis入门 案例:开发者社区首页 调试技巧 日志 版本控制-Git 发送邮件 开发 ...

  8. 【仿牛客网笔记】项目进阶,构建安全高效的企业服务——热帖排行

    p:投票数 T:发布时间间隔 G:系数,通常为1.5,1.8 计算帖子的分数 注入RedisTemplate 帖子刷新 实现定时任务 刷新帖子 实现更新帖子分数 刷新帖子分数任务 配置Trigger ...

  9. Java牛客网社区项目——知识点面试题

    Java牛客网社区项目--知识点&面试题 持续更新中(ง •̀_•́)ง 文章目录 Java牛客网社区项目--知识点&面试题 请简要介绍一下你的项目? 什么是Spring框架? 对Sp ...

  10. 仿牛客网社区项目 全栈总结

    学习仿牛客网社区项目 代码&资源 各章节总结 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 争取让每个知识点都有链接可点 项目总结 网站架构图 常见面试题 MySQL Red ...

最新文章

  1. flask小知识点总结
  2. 微软2019暑期实习笔试题
  3. java vue20.2.2浏览器_支持 Java 15!Java 开发工具 IntelliJ IDEA 2020.2发布
  4. java中push和pop指令的作用_汇编语言PUSH和POP指令(压栈和出栈)
  5. 高性能apache服务器配置大并发教程MPM模块配置
  6. STM32不同型号单片机keil工程移植说明
  7. python怎么导入背景_Pycharm主题设置以及导入方式
  8. 李开西老师 安全生产实战专家
  9. 打印机服务器找不到网络路径,分享0x80070035找不到网络路径的解决方法
  10. Less + HTML + JS实现流星划过星空动画
  11. Codeforces 1096D
  12. element click intercepted
  13. 关于长城!你可能不知道......
  14. AI for Science年度激辩:AlphaFold成功难以复制,数据人才生态建设都是挑战|MEET2023...
  15. Shader——漩涡效果
  16. incorrect integer value for column 问题解决
  17. 基于Android校园跳蚤市场交易系统的设计与实现
  18. 线电压和相电压,线电流和相电流的关系
  19. php投诉单页源码,PHP设计模式之简单投诉页面实例_PHP
  20. 【秒懂音视频开发】07_音频录制01_命令行

热门文章

  1. 标签体系,这么做才有实用价值
  2. Reversing:逆向工程揭密pdf
  3. 微信小程序——富文本
  4. 《软件方法(上)业务建模和需求》第2版 勘误(2022年10月24日更新)
  5. java魔界战记魔女_魔界战记风格RPG《魔女传说》最新公开!
  6. 2个超实用Mac软件免费下载地址,从此自力更生
  7. 从后台得到webshell技巧大汇总
  8. 品牌推广方案案例(二十个品牌策划经典案例分析)
  9. (七)Linux内存管理 - zoned page frame allocator - 2
  10. 迈普路由器NAT上网限速配置示例