Nginx
1. nginx + redis解决高并发问题?
nginx + redis解决高并发问题
接入层高性能缓存技术nginx+redis利器
总结:在nginx.conf中配置反向代理,将指定的请求url代理到redis服务器,并使用lua脚本查询数据。在redis服务器内部,使用lua定时器来定期更新缓存数据。
2. nginx缓存的缺点?
Nginx缓存的缺点和优点专家评价
总结:不支持url拼接参数的动态链接、不支持定期更新缓存、只能缓存响应状态码200的数据、无法自动选择存储介质。
WEB开发中常见安全漏洞分析
1. SQL注入漏洞
- SQL注入攻击是什么?
sql注入攻击详解(原理理解)
总结:把SQL命令插入到WEB表单,以达到欺骗服务器执行恶意SQL的目的。 - SQL注入防御?
如何有效防止sql注入
如何防止SQL注入–浅谈
总结:使用PreparedStatement进行预编译;使用存储过程;过滤请求参数中的数据库关键字;严格限制数据库权限。 - 为什么PreparedStatement能够解决SQL注入漏洞?
预处理prepareStatement是怎么防止sql注入漏洞的
SQL预编译
总结:Statement每次执行sql都会进行编译;PreparedStatement只有在创建的时候会进行预编译,并且将’#{}‘替换为占位符’?’,在对占位符进行set值的过程中,不会再进行编译,即:即使set的参数包含or、and等Mysql关键字,也只会被当做一个普通的参数处理。
2. DDOS漏洞
- DDOS攻击是什么?
什么是 DDoS 攻击?
总结:在短时间内对目标网站发起大量请求,以达到消耗目标服务器主机资源的目的。 - DDOS防御?
DDOS防护 ADS
总结:购买高防服务器、DDOS清洗、通过高防IP代理源站IP、CDN加速。
3. XSS漏洞
- XSS攻击是什么?
XSS
XSS跨站脚本攻击(一)----XSS攻击的三种类型
总结:攻击者在WEB页面中编写恶意的js、css脚本,当用户访问该WEB页面时,脚本就会执行,从而达到盗取用户敏感数据的目的,如:cookie、sessionId。 - XSS攻击的分类?
web安全之XSS攻击原理及防范
前端安全系列(一):如何防止XSS攻击
总结:- 反射型XSS:在请求URL中拼接恶意脚本,当用户访问该URL后,服务器会解析URL中拼接的恶意脚本并响应给前端,前端收到响应后执行该脚本;
- 存储型XSS:在数据库中存储恶意脚本,当用户访问该服务器后,响应恶意脚本给前端,前端收到响应后执行该脚本;
- DOM型XSS:在请求URL中拼接恶意脚本,前端JS自动获取请求URL中的恶意脚本并执行(前端安全漏洞)。
- XSS防御?
XSS及CSRF攻击防御
XSS 防御方法总结
Cookie中的httponly的属性和作用
HttpOnly Cookie 怎么讲
总结:- 对输入数据进行过滤;
- 对输出数据进行编码;
- 使用HttpOnly Cookie。
4. CSRF漏洞
- CSRF攻击是什么?
WEB安全入门系列之CSRF漏洞详解
总结:通过伪造受信任用户的请求来访问网站,在访问时自动携带用户Cookie。 - CSRF防御?
CSRF理解与防御
浅谈CSRF攻击方式
总结:- referer头部检测法;
- token检测法;
- 验证码。
5. SSRF漏洞
- SSRF攻击是什么?
Web安全-SSRF漏洞
总结:由于服务端提供了从其他服务器获取数据的功能,且没有对目标地址进行过滤和校验,而产生的漏洞。主要的危害有:- 对服务器内网进行端口扫描;
- 攻击服务器内网web应用;
- 利用file协议读取内网文件。
- SSRF防御?
Web安全-SSRF漏洞
总结:- 验证返回信息是否合理;
- 限制请求的端口号;
- 禁用不需要的协议。
6. 弱口令漏洞
- 弱口令漏洞是什么?
【web漏洞】弱口令
总结:系统登录口令复杂度不高,容易被暴力破解。 - 弱口令漏洞防御?
【web漏洞】弱口令
总结:- 设置登录口令提高复杂度;
- 验证码;
- 限制登录口令试错频率。
7. 文件上传漏洞
- 文件上传漏洞是什么?
文件上传漏洞攻击与防范方法
总结:攻击者通过上传可执行文件(如:shell脚本),达到获得服务器控制权的目的。 - 文件上传漏洞防御?
文件上传漏洞攻击与防范方法
总结:
+ 文件上传目录设置为不可执行;
+ 使用白名单的方式校验文件类型;
+ 单独设置文件服务器。
8. 短信被盗刷漏洞
- 如何处理短信被盗刷漏洞?
我们公司的短信接口被刷了,瞬间损失两万,怎么解决?(短信接口被盗刷系列1)
阿里云短信通道被人恶意刷了几万条短信,怎么办?(短信接口被盗刷系列3)- 限制请求频率;
- 加图形验证码;
- 设置黑名单。
消息队列
1. RabbitMQ基础?
RabbitMQ消息队列常见面试题总结
RabbitMQ快速入门(详细)
Springboot 整合RabbitMq ,用心看完这一篇就够了
RabbitMQ 中的消息会过期吗?
总结:RabbitMQ是用erlang语言编写的、实现了AMQP协议的消息中间件。
高级搜索
1. solr与es相比较?
Elasticsearch与Solr优缺点比较
ES面试基础知识要点
elasticsearch面试必考(亲身经历的问题)
总结:
- solr对实时搜索不友好,而es实时搜索性能很高;
- solr需要借助zk实现分布式高可用,es默认支持分布式;
- solr社区强大,有apache支撑,es相对较为弱小。
数据库
1. redolog、undolog是什么?
MySQL日志系统:redo log、binlog、undo log 区别与作用
总结:
- redolog:
- 存储引擎层日志;
- 当Mysql服务器执行更新请求时,会优先在redolog中记录更新后的值,再更新内存的数据,因而即时Mysql服务器崩溃,也能从redolog中恢复数据,因此redolog是crash-safe的;
- redolog的大小固定,当它用完后就会重头再写。
- binlog:
- Mysql Server层日志;
- 逻辑日志,记录原始逻辑,非crash-safe;
- 追加写,一页用完继续用另一页。
- undolog:
- 保存事务发生前的mvcc版本,用于回滚。
2. 数据库添加索引为什么能加快查询速度?
REDIS
1. redis缓存满了,继续写入数据会怎么样?
2.Redis为什么这么快?
3.Redis事务、持久化、发布订阅?
4.Redis的数据恢复?
Java基础
1. 还在用Executors创建线程池?小心内存溢出?
2. Java线程池中的各个参数如何合理设置?
3. Synchronized是如何实现可重入的?
Synchronized详解(可重入、Monitor原理等)
jvm:ObjectMonitor源码
总结:synchronized锁会被虚拟机编译成monitorEnter、monitorExit指令,monitorEnter会去尝试获取对象锁(对象头的运行时数据中的锁信息,指向ObjectMonitor对象)。执行monitorEnter时,该线程会被放入到ObjectMonitor的_entryList中,接着该线程通过CAS尝试将ObjectMonitor的_owner设置为当前线程,若设置成功,则判断之前的_owner是否就是当前self线程,若是,则可重入值+1。
4. Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法
总结:当向HashMap、HashSet等散列集合中存放数据时,优先会根据hashCode计算key的存储位置,若重写equals后不重写hashCode,会导致equals比较相同的对象用hashCode比较却不同。
Springcloud全家桶
1. Hystrix的几种模式的使用?
2. Eureka工作原理?
Eureka工作原理
【SpringCloud基础】Eureka实现原理
总结:
- eureka的核心组件:
- eureka server:注册中心、服务剔除、状态同步、自我保护机制
- eureka client:服务注册、服务续约、服务下线、服务调用
- eureka工作原理:
- eureka server启动,等待eureka client进行服务注册。如果eureka server开启了集群模式,还会通过replication进行状态同步;
- eureka client启动,到eureka server进行服务注册,每隔30s进行一次服务续约。
- 若eureka server90s内没有收到eureka client的心跳检测,则对其进行服务剔除。若单位时间内,大量的eureka client被服务剔除,则eureka server开启自我保护机制。当eureka client服务续约正常后,eureka server关闭自我保护机制;
- eureka client会定时全量或增量同步注册表的信息,并缓存到本地。进行服务调用时,优先从本地缓存表获取调用信息,若获取失败,则从eureka server注册表同步信息,再缓存到本地;
- eureka client实例正常退出时,会向eureka server发送取消请求进行服务下线,eureka server将该实例标记为下线状态。
3. spring eureka 服务实例实现快速下线快速感知快速刷新配置解析?
spring eureka 服务实例实现快速下线快速感知快速刷新配置解析
总结:
eureka server默认有二级缓存ReadWriteMap、ReadOnlyMap,当有client进行服务注册或者服务续约时,会修改ReadWriteMap。当有client进行服务查询时,会查询ReadOnlyMap。ReadWriteMap的数据会定时同步到ReadOnlyMap。
eureka client进行服务调用时,优先从本地缓存查询服务,调用失败再从server查询服务。
因此server、client都有可能存在延迟。
- 提高服务续约的频率,默认30s,可以改成5s;
- 提高服务剔除的频率,默认90s,可以改成15s;
- 提高ReadWriteMap与ReadOnlyMap同步的频率,默认30s,可以改成10s;
- 提高client刷新本地缓存的频率,默认30s,可以改成10s。
4. SpringMVC:如何保证Controller的并发安全?
SpringMVC:如何保证Controller的并发安全
总结:spring controller默认是单例的,是线程不安全的
- 避免在controller中定义成员变量,若必须使用,则定义ThreadLocal;
- 可以将controller声明为多例模式 @Scope(“prototype”)。
5. Mybatis常见面试题总结?
Mysql
1. MySQL主从复制原理?
2.数据库分库分表的原则?
若单库QPS成为性能瓶颈,则优先分库,否则分表;
若表的数据类过大,则优先水平分,否则垂直分;
垂直分的原则:
- 冷热:优先将查询频率高的字段拆分到一张表,频率低的放另外一张表;
- 字段长度:优先将超长字段放一张表,其余字段放一张表。
3.优化服务器设置?
- Mysql默认配置大多数情况下都是正确的,建议不要修改默认配置,将精力更多聚焦于索引、表设计上;
- 使用自定义的初始文件,不要使用mysql默认的my-default.ini;
- 修改缓冲池的大小,比较通用的做法是修改为系统内存的75%;
- 修改线程缓冲,避免频繁创建销毁线程;
- 修改日志缓冲区的大小,通常为1-8M;
- 修改Mysql并发数,即线程池线程数,公式为:CPU内核数 * 2 * 磁盘数;
- 调整max_connections数量;
- 优化排序,当查询中待排序的数据大于max_length_for_sort_data时,采用two-pass算法,否则采用single-pass算法。
4.MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)?
MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
mysql innodb死锁问题详解
总结:
- innodb死锁处理:对于mysql内部死锁,innodb通常能自动检测到,然后释放一个事务的锁后回滚,以确保另一个事务能正确执行;对于涉及mysql外部的死锁,通常需要设置锁等待超时参数 innodb_lock_wait_timeout来解决。
- 行锁:锁冲突概率低,锁粒度小,死锁;
- 页锁:锁冲突概率、锁粒度在行锁和表锁之间,死锁;
- 表锁:锁冲突概率高,锁粒度大,不会产生死锁。
- MyISAM锁:
- 表锁:表共享读锁和表独占写锁;
- Lock tables tb_user read local;
Select sum(id) from tb_user ;
Unlock tables;
- InnoDB锁:
- 行锁:共享锁、排他锁;
- select * from tb_user LOCK IN SHARE MODE;
- select * from tb_user FOR UPDATE;
- Mysql InnoDB行锁是通过给索引字段加锁实现的,因此只有通过索引字段来检索数据才能触发行锁,否则就是触发表锁。Oracle行锁是通过给数据块中对应数据行加锁实现的行锁。
架构
1. 如何处理高并发场景?
- 客户端:
- 限制请求的频率,如:验证码、请求倒计时。
- 云端:
- CDN;
- ELB + nginx + redis;
- 网关:
- 限制接口请求次数;
- 服务降级;
- 拒绝访问;
- 微服务:
- 拆分子系统;
- 缓存;
- 消息队列;
- 数据库:
- 分库分表;
- 读写分离。
2. tomcat 性能调优?
tomcat 性能调优
Tomcat 调优及 JVM 参数优化
总结:
- Connector连接器配置NIO,修改对并发数的支持;
- 配置Executor线程池;
- 调整虚拟机参数。