> 文章列表 > java面试准备19

java面试准备19

java面试准备19

如何保证缓存与数据库双写时的一致性?

一般来说,如果不是系统严格要求缓存+数据库必须一致性的话,缓存可以稍微地和数据库偶尔有不一致的情况。最好不要做这个方案,读请求和写请求串行化,串到一个内存队列中去,这样就可以保证一定不会出现不一致的情况。但是串行化之后,就会导致系统的吞吐量大幅度的降低,比正常情况下多几倍的机器去支撑线上的一个请求。

假如Redis里面有一亿个key,其中10w个key是以某个固定的已知的前缀开头的,如何将他们全部取出来?

使用keys指令可以扫出指定模式的key列表。
如果这个redis正在给线上的业务提供服务,那么使用keys指令会有问题。因为redis是单线程的,keys指令会导致线程阻塞一段时间,线上业务会停顿,直到指令执行完毕,服务才能恢复,这个时候使用scan指令,scan指令可以无阻塞的提取指定模式的key列表,但是会有一定的重复概率,因此需要客户端做一次去重,但是整体花费的时间会比keys指令时间长。

消息中间件如何保证消息的一致性

(1)主动方应该先把消息发送给消息中间件,消息状态标记为待确认。
(2)消息中间件收到消息之后,把消息持久化到消息存储中,但并不向被动方应用投递消息。
(3)消息中间件返回消息持久化结果(成功或者失效),主动方应用根据返回结果判断如何处理业务操作处理;
失败:放弃业务操作处理,结束(必须向上层返回失败结果)
成功:执行业务操作处理
(4)业务操作完成后,把业务操作结果(成功、失败)发送给消息中间件。
(5)消息中间件收到业务操作结果后,根据结果进行处理。
成功:更新消息存储中的消息状态为待发送(可发送),紧接着执行消息传递
失败:删除消息存储中的消息,结束
(6)前面的正向流程都成功后,向被动方应用投递消息。

Redis数据类型

(1)字符串类型
可以用于存储邮箱,JSON化的对象,甚至一张图片,一个字符串允许存储的最大容量是512MB,字符串是其它四种类型的基础,与其他几种类型的区别从本质上来说只是组织字符串的方式不同。
(2)散列类型
散列类型相当于Java中的HashMap,它的值是一个字典,保存很多key,value对,每对key,value的值都是字符串类型,换句话说,散列类型不能嵌套其他数据类型。
(3)列表类型
列表类型(list)用于存储一个有序的字符串列表,常用的操作时向队列两端添加元素或者获取列表的某一个片段。列表内部是用双向链表实现的,所以向列表两端添加元素的时间复杂度是O(1),越接近列表两端的元素速度越快。
(4)集合类型
集合中的元素没有顺序。
(5)有序集合类型
有序集合类型在集合的基础上为每个元素增加一个分数,这就让有序集合不仅支持插入、删除,判断元素是否存在外,还支持获取分数最高、最低的前N个元素,有序集合中的每个元素是不同的,但是分数确可以相同。

Redis集群如何同步

(1)全同步
全同步是第一次丛集连主机进行的同步,主机会生成一个RDB文件给从机,然后从机加载该文件。如果从机掉线时间很长也会触发这个同步,掉线时间短则使用额外的策略。
(2)部分同步
当主机收到修改命令后把命令发给从机进行同步。这里会有一个缓存区域,如果从机掉线,再次连接的时候会优先使用缓存区中的数据进行同步,实在不行才会使用全同步。

Redis为什么这么快

(1)绝大部分请求是纯粹的内存操作(非常快速)
(2)采用单线程,避免了不必要的上下文切换和竞争条件
(3)非阻塞IO-IO多路复用

GET和POST的区别

(1)GET是不安全的,因为在传输过程中,数据被放在请求的URL中;POST的所有操作对用户来说都是不可见的。
(2)GET请求提交的URL中的数据最多只能是2048字节,这个限制是浏览器或者服务器给添加的,http协议并没有对url长度进行限制,目的是为了保证服务器和浏览器之间能够正常运行,防止有人恶意发送请求,Post请求则没有大小限制。
(3)Get限制Form表单的数据的值必须为ASCII字符,而Post支持整个ISO10646字符集。
(4)Get执行效率比Post方法好,Get是form提交的默认方法。
(5)GET产生一个TCP数据包,POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一起发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok。

什么是对称加密与非对称加密

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何将密钥安全地发送给对方,而非对称加密是指用公钥和私钥,公钥可以随意发布,私钥只有自己知道。发送方使用对方的公钥对密文进行加密处理,对方收到加密信息后,使用自己的私钥进行解密。

Session、Cookie和Token的区别

HTTP协议本身是无状态的,即服务器无法判断用户身份。
(1)Cookie
cookie是由Web服务器保存在用户浏览器上的小文件(key-value格式),包含用户相关的信息。客户端向服务器发起请求,如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个Cookie,客户端就会将Cookie保存起来,当浏览器再次请求网站时,浏览器把请求的网址和Cookie一同传给服务器。服务器查看该cookie,以此来辨认身份。
(2)session
session是依赖Cookie实现的,session是服务器端对象,是浏览器和服务端会话过程中,服务器分配的一块存储空间。服务器默认为浏览器在cookie中设置sessionId,浏览器向服务器请求过程中传输cookie包含sessionId,服务器根据sessionId获取出会话中存储的信息,然后确认会话的身份信息。
cookie存储在客户端上,安全性较差,session数据放在服务器上,安全性相对较高。单个cookie保存的数据不能超过4k,很多浏览器限制一个站点最多保存20个cookie,session无此限制。session占用服务器性能。

(3)Token
Token是在客户端频繁向服务端请求数据,服务端频繁的区数据库查询用户名和密码并进行对比,判断用户名和密码是否正确,并作出相应提示,在这样的背景下,出现了Token。
Token的定义:Token是服务器端生成的一串字符串,以作为客户端请求的一个令牌,当第一次登录后,服务器生成一个一个Token然后将它返回给客户端,以后客户端只要带上这个token前来请求数据即可。
Token是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。

如果客户端禁止cookie,session还能用吗?

cookie与session,一般认为是两个独立的东西,session采用的是在服务端保持状态的方案,而cookie采用的是在客户端保持状态的方案。
session使用的是session ID来确定当前对话所对应的Session,而Session ID是通过Cookie来传递的,禁用cookie相当于失去了sessionId,也就得不到session了。

说说浏览器访问http://www.taobao.com,经历了怎样的过程。

首先是查找浏览器缓存,浏览器会保存一段时间内你之前访问过得网址的DNS信息,不同的浏览器保存的时长不同。如果没有找到对应的记录,这个时候浏览器会尝试调用系统缓存来继续查找这个网址对应的DNS信息。如果还是没有找到对应的ip,那么就会发送一个请求到路由器上,然后路由器在自己的缓存上查找记录,如果还没有,这个请求就会发送到ISP(互联网服务提供商,类似中国电信、移动),ISP也会有相对应的DNS服务器。
如果还没有找到,ISP的DNS服务器会将请求发向根域名服务器进行搜索,根域名服务器就是面向全球的顶级DNS服务器。如果到这里还是找不到域名对应的信息,那么就说明这个域名根本不存在,或者卖域名的把它给回收了。

浏览器终于得到了IP以后,浏览器就给这个ip的服务器发送一个http请求,请求方式为get,这里包含了主机(host)、用户代理(User-Agent),用户代理就是自己的浏览器,它是你的代理人,Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完成后不要断开连接,不断开的话下次连接就很块了。还有一个是Cookie,Cookies保存了用户的登录信息,在每次向服务器发送请求的时候就会重复发送给服务器。

服务器收到浏览器的请求后,它会解析这个请求,然后生成一个响应头和具体响应内容,就这服务器会传回来一个响应头和响应,响应头告诉了浏览器一些必要的信息,例如状态码,2开头如200表示一切正常,3开头表示重定向。

如果是个静态页面,那么基本到此为止了。动态页面时,主页页面框架传送过来以后,浏览器还要继续向服务器发送请求,请求的内容是主页里面包含的一些资源,如图片,视频,css样式等。这些非静态的资源要一点点请求过来。

绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?

绝对路径:如/etc/init.d
当前目录和上层目录:./ …/
主目录: ~/
切换目录: cd
查看当前进程: ps
执行退出:exit
查看当前路径: pwd
清屏:clear
退出当前命令:ctrl + c
彻底退出执行睡眠:ctrl + z
挂起当前线程 fg
查看当前用户id: “id”
创建目录:mkdir
创建文件:touch vi
查看文件内容:cat 文件名
编辑方式查看 vi 文件名
移动文件,改名文件:mv mv

爱美丽美妆