1)CA without P
在没有分区的情况下,如果ClientA向Server1发送修改X=1的指令,在进行事务机制将Server1的X修改为1后,Client1从Server1获取到的X也会是1。因为Client读取到的值一定是最新值,所以这里符合一致性,但显然不具备分区容错性,也就是说,如果服务器宕机了,那么读写就一定会失败。
2)AP without C
在有分区的情况下,如果ClientA向Server1和Server2发送修改X=1的指令,然而这指令并没有成功发送给Server2,那么Client1和Client从服务器中读取到的X值就不一样了。虽然这里满足了分区容错性,但并不满足一致性。
3)CP without A
如果为了保证一致性,那么在发送指令给服务器时,如果有一个命令没有成功发送,所有服务器都不能接收这个请求,这无疑降低了可用性。
BASE 理论是对 CAP 理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
基本可用(Basically Available): 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
软状态(Soft State): 软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。MySQL Replication 的异步复制也是一种体现。
最终一致性(Eventual Consistency): 最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
认证是关于验证凭据,如用户名/用户ID和密码,以验证身份。系统确定凭据是否正确。在公共和专用网络中,系统通过登录密码验证用户身份。认证通常通过用户名和密码完成,有时与认证因素结合使用,后者指的是认证的多种方式。
授权发生在系统成功认证身份后,最终会授予访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。简单来说,授权决定了访问系统的能力以及达到的程度。
对系统的访问受身份验证和授权的保护。可以通过输入有效凭证来验证访问系统的任何尝试,但只有在成功授权后才能接受。如果尝试已通过身份验证但未获得授权,系统将拒绝访问系统。
Session和Cookie的区别:
1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
session身份验证过程:
Token的定义
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
JWT的定义
JWT是基于token的一种授权认证方式,本质上就是一段带有签名并且经过加密处理与校验处理 的JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。
基于Token进行身份认证过程
CSRF(Cross Site Request Forgery)是 跨站请求伪造
Cookie 有一个过期时间,在这段时间内,Cookie 是存储在客户端的,当再次访问相同的网站时,浏览器会自动在 HTTP 请求中自动带上该网站用户登录后的 Cookie
CSRF 攻击也正是利用这点,借用用户的 Cookie,去执行非用户本意的操作。
token 验证的规则是,服务器从请求体(POST)或者请求参数(GET)中获取设置的 token,然后和 Cookie 中的 token 进行比较,一致之后才执行请求。
而 CSRF 攻击只是借用了 Cookie,并不能获取 Cookie 中的信息,所以不能获取 Cookie 中的 token,也就不能在发送请求时在 POST 或者 GET 中设置 token,把请求发送到服务器端时,token 验证不通过,也就不会处理请求了。
所以,token 可以防止 CSRF 攻击。
装载是指JVM找到class文件生成字节流,然后根据字节流创建java.lang.Class对象的过程。
链接过程分为 3 步:验证、准备、解析。
验证是链接的第一步,目的是为了确保.class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危及虚拟机本身的安全。
准备是链接的第 2 步,这一阶段的主要目的是为类中的静态变量分配内存,并为其设置“0值”。
解析是链接的最后一步,这一阶段的任务是把常量池中的符号引用转换为直接引用,也就是具体的内存地址。在这一阶段,JVM会将常量池中的类、接口名、字段名、方法名等转换为具体的内存地址。
这是 class 加载的最后一步,这一阶段是执行类构造器方法的过程,并真正初始化类变量。
JDK 1.7 中 的 ConcurrentHashMap 采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个 Map 加锁,分段锁大大提高了高并发环境下的处理能力。
底层是由一个 Segment 数组组成的,每个 Segment 元素包含一个 HashEntry 数组,而每个 HashEntry 元素都是一个链表结构的节点。
JDK 1.8 的 ConcurrentHashMap 取消了 Segment 分段锁,采取 CAS 和 synchronized 来保证并发的安全性。synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要 hash不冲突,就不会产生并发问题。
每个对象有一个引用计数属性,新增一个引用的时候计数加1,引用释放时计数减1,当计数为0的时候就可以回收
从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GCRoots 没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。
GC Roots的对象有: