赞
踩
下面的这些不够看?可以访问我的语雀专栏
https://www.yuque.com/greedy-9i38g/tzpwui?# 《面试题》
一个字节等于8位 1byte = 8bit。int :4个字节 32位 (-231~231-1)。口诀:1248,4812
都是Object类中的方法:
可变性 | 线程安全 | |
---|---|---|
String | 不可变 | 安全 |
StringBuilder | 可变 | 不安全 |
StringBuffer | 可变 | 安全,内部使用syvchronized进行同步 |
重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求;请求转发是服务器收到请求后为了完成响应转到另一个资源
重定向中有两次请求对象,不共享数据;请求转发只产生一次请求对象且在组件间共享数据
重定向后地址栏改变;请求转发不变
重定向的新地址可以是任意地址;请求转发必须是同一个应用内的资源
转发的方法:
HttpServletRequest
的getRequestDispatcher()方法获得ServletCOntext
的getRequestDispatcher()方法获得重定向的方法:
HttpServletResponse
的sendRedirect()方法有一种特殊的token :JSON WEB TOKEN(都叫它Jwt)
在网络应用中传递一些小批量的安全数据时使用,这个token的特点是紧凑并且安全,特别适用于分布式站点的单点登录
jwt结构主要分为三部分:header头部、payload负载、signature签名
主要应用场景:身份认证:
token多用于单点登录:
有多个应用系统,如果在同一域名下这就是普通的单点登录,比如:username.greedy.com
和 password.greedy.com
。同一域名下它们会共享本地的token
如果不在同一域名下,这时就需要用跨域单点登录的解决方案,最有名的规范就是JWT
一般情况,servlet是在被请求的时候才去创建的,它提供了生命周期的方法:实例化,初始化,服务和销毁。比如我们可以在初始化方法设置一些初始数据等。使用servlet时,一般都是继承httpServlet,然后分别实现doGet或者dePost方法,但是在这里面要注意的是,servlet并不是线程安全的,多线程单实例执行的,当并发访问同一个资源的话,就有可能引发线程安全问题,不要写全局变量
lock()
和释放锁unlock()
IP地址: 就好比每个人的身份证一样,可以通过IP地址精准找到你的设备
有一种特殊的IP地址:内网IP地址。由于IP地址有限,IP地址不够用,于是每个局域网就对外共用同一个IP地址,内部的设备就用内网的IP地址,内网和外网采用路由器进行连接和转发消息,内网IP有三个保留的IP地址段:10,192,172
MAC地址: 也叫物理地址,是硬件厂家直接烧在网卡上的。理论上MAC地址是唯一的,但是MAC地址可以通过程序修改,可能会重复
IP地址与MAC地址在计算机里都是以二进制的方式进行表示的,IP地址是32位的,MAC地址是32位的
DNS: 由于IP地址是一堆数字不容易被记住,所以有了域名(域名就是相当于IP地址的一个别名),DNS就是把域名转换成IP地址的
第一步:专业说法:DNS 查询分级缓存策略(DNS Query)
找缓存顺序:浏览器 —> 操作系统 —> 本地服务商 —> 根服务器
第二步:向IP地址发起连接请求,进行TCP三次握手四次挥手
三次握手
四次挥手
第三步:页面展现
首先解析HTML文件创建DOM树,之后解析CSS形成CSS对象模型,将CSS模型跟DOM树合并成渲染树
CDN中文名称:内容分发网络,用来做内容分发的一套网络体系,用来提升文件下载速度的一种机制,让用户在离自己最近的CDN服务器进行下载,减少路由次数,提升用户体验。(有点像在京东购物,会在距离你下单地址最近的仓库给你发货的意思)
类别 | 原因 |
---|---|
1XX | 服务器收到请求,需要客户端继续发送请求 |
2XX | 请求正常处理完毕 |
3XX | 重定向,需要进一步操作 |
4XX | 请求无效,客服端错误,服务端无法处理请求 |
5XX | 服务器后端出错 |
详细:
100:告诉客户端继续发送请求
200:表示请求响应成功
201:请求成功,服务器创建了新资源
202:请求已经被处理还未做出响应
301:请求的网页被永久移动到了新位置客户端收到301请求后,通常用户会向新地址发起GET请求
308:永久重定向客户端收到308请求后,延用旧的method(POST/GET/PUT)到新地址
400:请求无效,常见的情况是请求参数有误,HTTP头构建错误
403:禁止访问
404:访问不到资源
500:服务器后端错误
505: 服务器不支持请求中所使用的 HTTP 协议版本
区别 | HTTP | HTTPS |
---|---|---|
协议 | 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份 | 身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之 上, 是添加了加密和认证机制的 HTTP。 |
端口 | 80 | 443 |
资源消耗 | 较少 | 由于加解密处理,会消耗更多的CPU和内存资源 |
开销 | 无需证书 | 需要证书,而证书一般需要向认证机构购买 |
加密机制 | 无 | 共享密钥加密和公开密钥加密并用的混合加密机制 |
安全性 | 弱 | 由于加密机制,安全性强 |
MySQL数据库为我们提供的四种隔离级别:(级别从低到高,级别越高越安全,效率越低)
Read committed (读已提交):一个事务只能看见已经提交事务所做的改变。可避免脏读的发生。
Read uncommitted (读未提交):Oracle默认事务隔离级别所有事务都可以看到其他未提交事务的执行结果。
Repeatable read (可重复读):MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。
Serializable (串行化):通过强制事务排序(当前事务没结束,其它事务就得等着),使之不可能相互冲突,从而解决幻读问题。
JDK自带三个类加载器:启动类加载器、扩展类加载器、应用类加载器
假设有这样一段代码:String s = “abc”;
代码开始执行前,会将所有需要的类全部加载到JVM中,通过类加载器加载,看到上述代码类加载器会找String.class文件,找到就加载。
@SpringBootApplication
是组合注解,由@ConponentScan、@EableAutoConfiguration、@SpringBootConfiguration和其它注解组成
META-INF/spring.fanctories
中的自动配置类
AutoConfigurationImportSelector.class
会通过SpringFactoriesLoader.class
扫描"META-INF/spring.factories"
@Import(自动配置类.class)
,引入的配置解析优先级高,自动配置类的解析应该在主配置类(程序员写的类)没提供时作为默认配置AutoConfigurationImportSelector.class实现了DeferredImportSelector接口,让自动配置类解析晚于主配置类
@Order:控制bean的执行顺序,数字越小优先级越高
@Configuration
@Import
四种用法
解析规则
不允许覆盖的情况下, 如何能够让主配置类(程序员自己写的配置类)的配置优先?
@Lazy
动态SQL:
静态SQL:
值得注意一点:
如select * from user where age > ?
这种语句是静态SQL,虽然个别参数的值不知道,但整个SQL的结构已经确定,数据库是可以将它编译的。动态SQL最明显的例子就是多条件查询,其中查询的条件每次并不确定有哪些
缓存同步其实就是当缓存信息发生了变化,也就是后台对数据进行了增
删
改
操作后,数据库中发生了变化的数据删除相应的缓存即可。当页面再次请求数据时,缓存不能命中,会从数据库中查询并且添加到缓存中,即实现了缓存同步
缓存穿透是查不到,与缓存击穿有明显的区别。缓存击穿是查到的太多了!
redis缓存中没有该条查询结果,会去数据库中查询,查询一次没有就查询两次,如果这个时候秒杀系统(也可能是有人采用洪水攻击)大量给数据库发送请求,数据库可能会招架不住导致崩溃 ┗( T﹏T )┛
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储层的查询压力。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的
当存储层不命中后,即使返回的空对象也能将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源。如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的空键
即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间的窗口不一致,这对于需要保持一致性的业务造成影响
简述:
缓存击穿与缓存穿透不一样,缓存击穿是一个key非常热点,一直在扛着高并发。俗话说就是:对着一个点猛攻!
当这个Key在过期的那一瞬间,由于缓存过期会同时访问数据库来查询最新数据,并回写缓存,这会导致数据库瞬间压力过大
解决方案:
简述:
是指在某一时间段内,缓存集体过期失效,或者是Redis宕机,就是上图中缓存层没有啦
但最致命的是缓存服务的某个节点宕机,对数据库造成的压力不可预知,很有可能瞬间就把数据库搞垮
解决方案:
简述:
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例
哨兵两个作用:
一个哨兵监控的时候可能会有偷懒的时候 ,这个时候就需要多个哨兵,而且让哨兵之间互相监督不许偷懒
文字叙述一下故障转移过程:
假设哨兵A发现主机挂掉啦,不会马上进行故障转移,因为这仅仅是它自己主观认为主机挂掉了,这个现象网上称为主观下线。等到发现主机挂掉到达一定数量的其他哨兵,它们会集合起来开会,最后决定由一个哨兵去进行故障转移。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从机切换为主机,这个过程称为客观下线。这样对于外部而言,一切都是透明的
RDB可以看作为某一时刻Redis的快照,比较适合灾难恢复,可以看作快照
优点:主进程不进行任何IO操作,确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是很敏感,那么RDB方式要比AOF方式更加高效
缺点:最后一次持久化的时候如果宕机,数据可能丢失。fork进程的时候,会占用一定的内存空间
RDB触发机制
恢复RDB文件
只需要将RDB文件放在redis启动目录,redis启动的时候会自动检查dump.rdb恢复其中的数据
AOF是将所有命令都记录下来,恢复的时候把文件全部再执行一遍
AOF默认是关闭的,需要在配置文件中开启AOF。Redis支持AOF和RDB同时生效,如果同时存在,AOF优先级高于RDB(Redis重新启动时会使用AOF进行数据恢复)
监听执行的命令,如果发现执行了修改数据的操作,同时直接同步到数据库文件中
优点:相对RDB数据更加安全
缺点:相同数据集AOF要大于RDB,相对RDB可能会慢一些
机制**
恢复RDB文件
只需要将RDB文件放在redis启动目录,redis启动的时候会自动检查dump.rdb恢复其中的数据
AOF是将所有命令都记录下来,恢复的时候把文件全部再执行一遍
AOF默认是关闭的,需要在配置文件中开启AOF。Redis支持AOF和RDB同时生效,如果同时存在,AOF优先级高于RDB(Redis重新启动时会使用AOF进行数据恢复)
监听执行的命令,如果发现执行了修改数据的操作,同时直接同步到数据库文件中
优点:相对RDB数据更加安全
缺点:相同数据集AOF要大于RDB,相对RDB可能会慢一些
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。