其它
1. Cookies与Session的区别
结合用户登录中两者的角色去说
因为Http是无状态的, 而有时就需要保持状态, 这时就使用Session机制来保持状态信息
最典型的就是用户登录后要保持状态。
当用户第一次访问站点时,服务器为用户创建一个session ID,这就是针对这个用户的唯一标识,每一个访问的用户都会得到一个自己独有的session ID,这个session ID会存放在响应头里的cookie中,之后发送给客户端。这样客户端就会拥有一个该站点给他的session ID。
当用户第二次访问该站点时,浏览器会带着本地存放的cookie(里面存有上次得到的session ID)随着请求一起发送到服务器,服务端接到请求后会检测是否有session ID,如果有就会找到响应的session文件,把其中的信息读取出来;如果没有就跟第一次一样再创建个新的。
如果该session表示用户是登录的, 那么就相当于记住了用户的登录状态。
当cookies过期后,session就失效了, 需要用户重新登录得到新的session ID
2. 各种设计模式
谈是什么以及在各个框架中的应用
- 访问者模式, 将数据结构与算法分离, 树的遍历, 语法树的改写,详细介绍Walk与Visit
- 代理:AOP,Log,在不改变已有类的情况下, 为其添加功能
- 单例
- 工厂: 利用反射生成对象
- 模板:Netty中抽象类的使用
- 适配器:将不适配的接口变成适配的接口
- 装饰模式与代理模式的区别:代理模式往往是代理类代替用户去创建代理类, 也就是用户往往是直接使用代理类, 而装饰用户需要用户显示的创建被装饰类以及装饰类。(对此保持疑问)
- 观察者模式, 发布-订阅, Model-View, EventBus中使用了
- 拦截过渡器模式: Netty中的Pipeline
4. select与epoll的区别
https://segmentfault.com/a/1190000003063859#articleHeader17
5. TCP协议仔细看一遍
一个IP包只能有一个TCP segment, 不能有多个, 这是因为TCP头部并没有关于整个Segment长度的字段, 但是一个TCP segment可以分成多个, 每一个添加一个头部, 分为多个IP字段传送.
12. 针对3次握手的恶意攻击,如何应对
6. 缓存算法 FIFO, LRU, LFU
在缓存空间有限的情况下, 以上算法仅仅是替换策略和访问策略的不同
6.1 各缓存算法的替换策略与实现
FIFO: 这个最简单, 利用一个队列, 替换掉队头的元素, 为了快速访问到元素, 可以利用HashMap保存Key在队列中的位置
LRU:如果一个数据在最近一段时间没有被访问到, 在将来它被访问到的可能性也很小。
实现, 可以利用一个链表, 从链表头到链表尾代表访问时间越来越久远, 链表头的是最近访问的, 表尾的是很久没有访问的。如果访问了一个节点, 就将其放入到链表头部。
为了加快各中操作的效率, 见如下文章
LFU:最近最少使用, 注意与LRU的不同, LRU是基于访问时间的, LFU是基于访问次数的, 所以LFU算法要想办法记住一个条目最近的访问次数
实现
-
利用一个数组存储数据项, 利用HashMap存储数据项在数组中的位置, 然后为每个数据项设计一个访问频次, 当数据项命令中, 访问频次自增, 在淘汰时淘汰访问频次最少的数据, 因为要找到访问频次最少的数据需要遍历数组, 所以淘汰的时间复杂度为O(n)。插入和访问操作都是O(1)
-
因为每一个都要淘汰一个访问最少的数据, 所以可以利用小顶堆+hashmap, 这样, 插入和淘汰操作都是O(logN)
6.2 对缓存算法的选择:结合实际的场景,选择命中率高的。
举例:Android中List所使用图片的缓存算法.
想想List中对图片的使用, 总是期待保留最近看过的, 如当在第100页时, 很可能回到第99页, 而不太可能回到第1页, 那么这里就选择LRU, Android中的LRUCache就是这样做的
参见
8. 进程间通信几种方式
- 管道:速度慢,容量有限,只有父子进程能通讯
- 命名管道:不相关进程间也可以通讯
- FIFO:任何进程间都能通讯,但速度慢
- 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
- 信号量:不能传递复杂消息,只能用来同步
- 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
9. 常用的Hash算法
Hash函数构造方法
- 直接定址法:取关键字或关键字的某个线程函数值为哈希地址
- 数字分析法:取关键字的若干数位组成哈希地址
- 除留余数法:除某一个数得到的余数作为Hash地址
处理冲突的方法
- 开放定址法:就是不断探测冲突地址后的位置是否有空的
- 再哈希法:当冲突时, 利用另一个哈希函数计算地址
- 链地址法:最常用。
17. GET, POST, PUT以及幂等性
GET用来获取资源, 不应该有副作用, 是幂等的
POST用来提交数据, 肯定有副作用, 不是幂等的
PUT用来更新数据, 有副作用, 是幂等的
纠正自己以前错误的认识, 以RFC为准
What is the difference between POST and GET?
不能只从网上听说, 这也是知识只从网上听说导致的弊端.