仿牛客网社区项目 全栈总结
学习仿牛客网社区项目
代码&资源
各章节总结 |
---|
第一章 |
第二章 |
第三章 |
第四章 |
第五章 |
第六章 |
第七章 |
第八章 |
争取让每个知识点都有链接可点
- 项目总结
- 网站架构图
- 常见面试题
- MySQL
- Redis
- Spring
项目总结
Spring Boot:降低项目核心组件开发难度
Spring:核心技术
- Spring MVC:解决前后端请求处理的问题
- Spring Security:提高安全性,身份认证和管理权限
其他组件:
- Spring Email:发邮件
- Interceptor:拦截器,拦截请求
- Advice:通知,用于统一记录日志,结合AOP来看
- AOP:面向切面,主要用于记录业务层日志
- Transaction:事务模块
- Redis:提供高性能存储的k-v数据库,五种数据结构
- MyBatis:一种持久层框架,与数据库交互
- Kafka:生产者消费者模式,处理系统通知
- Elasticsearch:一种搜索引擎,以索引方式存储数据
- Quartz:进行任务调度
- Caffeine:管理本地缓存
网站架构图
客户端:浏览器或APP
Nginx:对服务器做反向代理,多个服务器时可负载均衡
CDN:第三方缓存服务器,部署在各地,提高性能
Server:本地服务器
DB:数据库,读写分离
Redis:实现二级缓存,先访问本地缓存,没有的话访问Redis,还没有访问DB
Kafka:消息队列,控制生产者消费者速率
Elasticsearch:搜索引擎
文件:文件服务器
HR关注的问题:性能、可靠性、安全性
研究透一个 比 明白两个 更好
常见面试题
MySQL
存储引擎
- InnoDB:支持事务
事务
- 事务的特性:原子性、一致性、隔离性、持久性
- 事务的隔离性
- 并发异常:第一类丢失更新、第二类丢失更新、脏读、不可重复读、幻读
- 隔离级别:Read Uncommitted、 Read Committed、 Repeatable Read、 Serializable
- Spring事务管理
- 声明式事务
- 编程式事务
锁
范围
- 表级锁:开销小、加锁快,发生锁冲突的概率高、并发度低,不会出现死锁。
- 行级锁(InnoDB):开销大、加锁慢,发生锁冲突的概率低、并发度高,会出现死锁。
类型
共享锁(S):行级,读取一行
排他锁(X):行级,更新一行
意向共享锁(IS):表级,准备加共享锁
意向排他锁(IX):表级,准备加排他锁
- 间隙锁(NK):行级,使用范围条件时,对此时范围内不存在的记录加锁。一是为了防止幻读,二是为了满足恢复和复制的需要。
加锁
- 数据查询语句DQL(
SELECT
),操纵DML(INSECT
,DELECT
,UPDATE
),定义DDL(CREATE
),控制DCL(GRANT
) - 增加行级锁之前,自动加意向锁
- 在执行DML之前,InnoDB自动加排他锁
- 执行DQL,默认不加锁
- 数据查询语句DQL(
死锁
场景描述
此种情况若事务1执行一半,同时事务2执行一半,二者分别对ID=1和ID=2的数据加了X锁,导致后面的命令无法执行,陷入死循环。
解决方案
InnoDB自动检测这种情况,将一个事务回滚,另一个事务继续执行;设置超时等待参数
避免死锁
首先,当不同的业务访问多个表时,约定相同的顺序访问这些表;
之后,当访问批量数据时,约定线程以相同的顺序访问数据;
如果要更新记录,应直接申请X锁,而不是S锁再转换X锁。
索引
- B+Tree
- 数据分块存储,每一块称为一页;
- 所有的值都是按顺序存储的,并且每一个叶子到根的距离相同;
- 非叶节点存储数据的边界,叶子节点存储指向数据行的指针;
- 通过边界缩小查找的范围,从而避免全局扫描,加快查找速度。
- B+Tree
Redis
- 数据类型
值有七种数据类型
过期策略
- 将过期的key放在一个独立的字典里,不会立刻删除。因为每一个key都删除效率太低。
- 惰性删除:当客户端访问key时,检查是否过期,过期则删除;
- 定期扫描:默认每秒扫描10次。
- 先从字典中随机选择20个key;
- 删除其中过期的key;
- 若删除的比例超过25%,则重新执行一轮
淘汰策略
- 当内存超出最大限制时,需要淘汰一些数据腾出空间
- 两种主流策略:淘汰剩余寿命(TTL)最短的;淘汰访问次数最少的(近似LRU算法)
- 近似LRU算法:每个key维护一个时间戳,淘汰时随机选择5个key,淘汰最旧的key。如果还超,就继续淘汰。
缓存穿透
- 查询根本不存在的数据,缓存里肯定没有,只能提交给数据库查询。这种请求一多,数据库负载过大就崩了。
- 解决方案:
- 在数据库未查询到,给客户端返回空值的同时,将空值存入缓存。下次访问直接返回空。
- 在缓存层之前设置布隆过滤器,将所有key存入,若请求无效的key,直接过滤。
缓存击穿
- 访问量很大的数据,在缓存失效瞬间,大量请求涌入存储层。
- 解决方案:
- 在一个线程访问时加互斥锁,其他线程等待。访问结束,缓存中已有数据,其他线程访问缓存即可。
- 设置永不过期,物理上
- 设置逻辑过期时间,当发现一个value逻辑过期,使用一个单独的线程重建缓存,逻辑上
缓存雪崩
- 缓存击穿的升级版。有大量的热门缓存,同时失效。或缓存服务器宕机。
- 解决方案:
- 避免同时过期,附加一个随机数
- 构建高可用的Redis缓存
- 构建多级缓存,本地缓存
- 启用限流和降级措施,对数据库限流,服务降级
分布式锁
- 分布式部署中,经常将数据读到内存,修改后返回给数据库。但这一操作可能被多个进程同时进行,读和写不是原子操作,需要加锁
- 基本原理:
- 同步锁:在多个线程都能访问到的地方,做一个标记,标记该数据的访问权限
- 分布式锁:在多个进程都能访问到的地方,做一个标记,标记该数据的访问权限
- 实现方式:
- 基于数据库实现分布式锁
- 基于Redis实现分布式锁
- 基于Zookeeper实现分布式锁
- Redis实现锁的原则
- 独享。在任一时刻,只有一个客户端持有锁
- 无死锁。即使持有锁的客户端崩溃或网络被分裂,锁依然可以被获取
- 容错。只要Redis大部分节点活着,客户端就可以获取和释放锁
Spring
- Spring IoC
Spring AOP
Spring MVC
- 调度顺序:
- 客户端发送请求给调度程序(DispatcherServlet)
- DS调度HandlerMapping组件,HM将Adapter返回给DS
- HM调用HandlerAdapter组件,获取其中的Controller,将模型数据和视图返回给DS
- DS调用视图解析器(ViewResolver),将ModelAndView发给它
- VR根据此找到对应的模板引擎,由模板引擎做为客户端做渲染
仿牛客网社区项目 全栈总结相关推荐
- Java牛客网社区项目——知识点面试题
Java牛客网社区项目--知识点&面试题 持续更新中(ง •̀_•́)ง 文章目录 Java牛客网社区项目--知识点&面试题 请简要介绍一下你的项目? 什么是Spring框架? 对Sp ...
- 仿牛客网社区开发--核心功能模块
1.过滤敏感词 我们想在某个网站上发布一些内容的时候,网站会对我们所发布的内容进行过滤,如果发现我的内容里包含一些色情.暴力等非法词汇,会把这些词汇隐去,即不显示或者打码,那么这种行为就叫过滤敏感词. ...
- 牛客网社区项目——p3.4事务管理
数据库保障事务的机制如下 spring事务管理 在业务层模拟某个业务,注册用户和自动发送新人报到帖这两个业务视作一个事务 代码如下(两种方法): @Transactional(isolation = ...
- 从零开始—仿牛客网讨论社区项目(一)
主要技术架构: SpringBoot Spring SpringMVC MyBatis Redis Kakfa Elasticsearch Spring Security Spring Actator ...
- 从零开始—仿牛客网讨论社区项目(六)
主要技术架构: SpringBoot Spring SpringMVC MyBatis Redis Kakfa Elasticsearch Spring Security Spring Actator ...
- 仿牛客网讨论社区项目—优化网站性能
性能优化: 1.考虑加入缓存优化 优化热门帖子列表 GitHub中搜索caffeine 在Maven Repository搜索caffeine配置文件,在resources文件包内的pom.xml文件 ...
- 云服务器上部署仿牛客网项目
云服务器上部署仿牛客网项目 安装JRE 安装Maven 安装MySQL 给mysql导入数据 安装Redis 安装kafka 安装ElasticSearch Wkhtmltopdf 安装tomcat ...
- 仿牛客网项目第五,六章:异步消息系统和分布式搜索引擎(详细步骤和思路)
目录 1. Kafka:构建TB级异步消息系统 1.0 同步/异步消息的区别 1.1 项目的目的 1. 2 阻塞队列实现异步消息系统 1.4 Kafka入门 1.5 Spring整合Kafka 1.6 ...
- 2021-04-10 仿牛客网第六章
一.Elasticsearch入门 仿牛客网 内容部分引用至 https://blog.csdn.net/weixin_44406146 目录 一.Elasticsearch入门 Elasticsea ...
最新文章
- szu 寒训复习day #4数论入门详解[修改]用Mardown再改了一下
- QIIME 2用户文档. 22Python命令行模式(2019.7)
- 10个随机数相加等于100
- 再见微服务,从100多个问题儿童到一个超级明星
- pyrDown和pyrUp函数
- 中国香皂行业产量份额预测与消费需求商机研究报告2022年
- Delphi 2009 超前预知!
- 用python实现TCP协议传输功能(客户端代码)
- 数据库SQL基础select语法
- 高并发图片实时渲染技术在阿里妈妈的大规模应用
- 一桩物理学“悬案”终被破解
- linux mysql dump命令_linux下mysql命令
- 企业该怎样选择物联网卡平台,需要遵循哪些标准?
- 我装上去了 php editor打不开
- linq to sql中的自动缓存(对象跟踪)
- Input禁用文本框
- mysql 小数转换成百分数查出(保留两位小数百分数)
- PDF格式分析(六十五) Text 文字——字体数据结构
- STM32工程更换芯片方法
- unity 简易太空大战